zoukankan      html  css  js  c++  java
  • XML.04-dom4j和XPath

     

    • 下载对应的jar包,导入到对应的工程中
    • 对于对于的web项目,复制dom4j-1.6.1.jar到 WebRoot – WEB-INF – lib里面
    • 对于java项目:新建source folder–>复制jar包–>右键–>build path–>add to build path

    dom4j的基本使用

    基本的解析

    1.    public Document parseDoc(String filePath) throws DocumentException {
    2. return new SAXReader().read(filePath);
    3. }

    读取一个元素

    1.    public void getElement() throws DocumentException{
    2.
    3. Document document = parseDoc(path);
    4. Element root = document.getRootElement();
    5. List<Element> books = root.elements("书");
    6. Element book2 = books.get(1);
    7. Element author2 = book2.element("作者");
    8. System.out.println(author2.getText());
    9.
    10. }

    在元素末尾添加子元素

    1.    public void addElement() throws Exception{
    2. Document document= parseDoc(path);
    3. Element root = document.getRootElement();
    4. Element book2 = (Element)root.elements("书").get(1);
    5. book2.addElement("cat").setText("I am a cat");
    6. writeBack(document, path);
    7. }

    在任意位置添加子元素

    1.    public void insertElement() throws Exception{
    2. Document document = parseDoc(path);
    3. Element root = document.getRootElement();
    4. Element book2 = (Element)root.elements("书").get(1);
    5. List<Element> list = book2.elements();
    6. Element cat = DocumentHelper.createElement("cat2");
    7. cat.setText("I am a cat too");
    8. list.add(1, cat);
    9. writeBack(document, path);
    10. }

    在任意位置添加,这回真的是任意位置了…dom4j并没有提供insertBefore这种方法,但是我们通过elements()方法拿到的一个list真的是个list…所以可以直接add进去.

    删除一个元素

    1.    public void removeElement() throws Exception{
    2. Document document = parseDoc(path);
    3. Element root = document.getRootElement();
    4. Element book2 = (Element)root.elements("书").get(1);
    5. //Element cat = root.element("cat2");
    6. Element cat = book2.element("cat2");
    7. book2.remove(cat);
    8. writeBack(document, path);
    9.
    10. }

    elements()方法,只是查找当前元素的下一级的子元素,注意注释那一行,刚开始写错了,而且神奇的是这玩意儿没找到也不报错…

    修改一个元素

    1.public void changeElement() throws Exception{
    2. Document document = parseDoc(path);
    3. Element root = document.getRootElement();
    4. Element book2 = (Element)root.elements("书").get(1);
    5. Element author2 = book2.element("作者");
    6.
    7. author2.setText("西川结衣");
    8. writeBack(document, path);
    9. }

    回写

    1.    public void writeBack(Document document,String filePath) throws Exception{
    2. OutputFormat format = OutputFormat.createPrettyPrint();
    3. format.setEncoding("UTF-8");
    4. XMLWriter writer = new XMLWriter(new FileOutputStream(filePath), format);
    5. writer.write(document);
    6. writer.close();
    7. }

    XPath

    啥是XPath

    XPATH是在XML中查找信息的一种语言,通过它可以很方便快捷精确的找到一个元素.

    • 使用路径表达式在XML文档中导航
    • 包含一个标准函数库
    • 是W3C的标准
    • 是XSLT的主要元素(这是什么玩意儿,实在不想查了)

    XPath语法

    XPath中有七种节点: 元素,属性,文本,命名空间,处理指令,注释以及文档(根节点)

    XML文档是被当作一个树对待的,文档节点也就是所谓的根节点. 其他的叫法都遵循树的原则.

    路径表达式

    表达式 描述
    nodeName 选取此节点的所有子节点
    / 从根节点开始匹配
    // 从匹配选择的当前节点选择,不考虑位置
    . 当前节点
    .. 当前节点的父节点
    @ 属性

    比如

    • bookstore 选取bookstore元素所有的子节点
    • /bookestore 选取根元素bookstore
    • bookst/book 选取属于bookstore的子元素的所有book元素
    • //book 选取所有book子元素,不管在什么位置
    • bookstore//book 选取属于bookstore的后代的所有book元素. 不管它位于bookstore下的什么位置
    • //@lang 选取名为lang的所有属性
    • /AAA/BBB 从根节点开始获取BBB元素
    • //BBB 忽略层级关系,获取所有BBB元素
    • //BBB/DDD 找所有BBB下的DDD元素

    谓语

    用来查找特定条件的节点,写在方括号里

    比如:

    • /bookstore/book[1] 选取属于 bookstore 子元素的第一个 book 元素。
    • /bookstore/book[last()] 选取属于 bookstore 子元素的最后一个 book 元素。
    • /bookstore/book[last()-1] 选取属于 bookstore 子元素的倒数第二个 book 元素。
    • /bookstore/book[position()<3] 选取最前面的两个属于 bookstore 元素的子元素的 book 元素。
    • //title[@lang] 选取所有拥有名为 lang 的属性的 title 元素。
    • //title[@lang=’eng’] 选取所有 title 元素,且这些元素拥有值为 eng 的 lang 属性。
    • /bookstore/book[price>35.00] 选取 bookstore 元素的所有 book 元素,且其中的 price 元素的值须大于 35.00。
    • /bookstore/book[price>35.00]/title 选取 bookstore 元素中的 book 元素的所有 title 元素,且其中的 price 元素的值须大于 35.00。
    • /AAA/BBB[1] 找AAA下的第一个BBB
    • /AAA/BBB[last()] 最后一个

    通配符

    • /AAA/BBB/CCC/* 考虑层级关系找/AAA/BBB/CCC/下的所有元素
    • //* XML中的所有元素
    • //@id 选择所有

    选取若干路径

    可以使用| 来选取若干路径,比如

    • //book/title | //book/price

    再复杂的就去看W3school吧…

    Dom4j对XPATH的支持

    dom4j是支持XPath的,需要导入jaxen包

    仅可以使用的两个方法:

    • selectNodes()
    • selectSingleNode()

    不多做解释.


  • 相关阅读:
    希望走过的路成为未来的基石
    第三次个人作业--用例图设计
    第二次结对作业
    第一次结对作业
    第二次个人编程作业
    第一次个人编程作业(更新至2020.02.07)
    Springboot vue 前后分离 跨域 Activiti6 工作流 集成代码生成器 shiro权限
    springcloud 项目源码 微服务 分布式 Activiti6 工作流 vue.js html 跨域 前后分离
    spring cloud springboot 框架源码 activiti工作流 前后分离 集成代码生成器
    java代码生成器 快速开发平台 二次开发 外包项目利器 springmvc SSM后台框架源码
  • 原文地址:https://www.cnblogs.com/thecatcher/p/6220707.html
Copyright © 2011-2022 走看看