XML解析之XPath

XPath 是一门在 XML 文档中查找信息的语言。XPath 可用来在 XML 文档中对元素和属性进行遍历。
XPath 是 W3C XSLT 标准的主要元素,并且 XQuery 和 XPointer 都构建于 XPath 表达之上。
因此,对 XPath 的理解是很多高级 XML 应用的基础。


基本的XPath语法类似于在一个文件系统中定位文件,如果路径以斜线 / 开始, 那么该路径就表示到一个元素的绝对路径
/AAA
选择根元素AAA
/AAA/CCC
选择AAA的所有CCC子元素
/AAA/DDD/BBB
选择AAA的子元素DDD的所有子元素BBB

如果路径以双斜线 // 开头, 则表示选择文档中所有满足双斜线//之后规则的元素(无论层级关系)
//BBB
选择所有BBB元素
/ /DDD/BBB
选择所有父元素是DDD的BBB元素

星号 * 表示选择所有由星号之前的路径所定位的元素
/AAA/CCC/DDD/*
选择所有路径依附于/AAA/CCC/DDD的元素
/*/*/*/BBB
选择所有的有3个祖先元素的BBB元素
//*
选择所有元素

方块号[ ] 里的表达式可以进一步的指定元素, 其中数字表示元素在选择集里的位置, 而 last() 函数则表示选择集中的最后一个元素.
/AAA/BBB[1]
选择AAA的第一个BBB子元素
/AAA/BBB[last()]
选择AAA的最后一个BBB子元素

@
//@id
选择所有的id属性
//BBB[@id]
选择有id属性的BBB元素
//BBB[@name]
选择有name属性的BBB元素
//BBB[@*]
选择有任意属性的BBB元素
//BBB[not(@*)]
选择没有属性的BBB元素

//和DOM4j对比
Book.xml 最终输出结果:output.xml
<?xml version="1.0" encoding="utf-8"  ?>
<书架>
        <书>
        <书名 id="001">浪潮之巅</书名>
                <作者>吴军</作者>
                <售价>29</售价>
        </书>
        <书>
                <书名 id='002'>数学之美</书名>
                <作者>吴军</作者>
                <售价><第一版>29</第一版></售价>
        </书>
</书架>
<?xml version="1.0" encoding="utf-8"?>
<书架>
  <书>
    <书名 id="001">浪潮之巅</书名> 
    <作者>吴军</作者> 
    <售价>29</售价>
  </书> 
  <书>
    <书名 id="002">java编程思想</书名> 
    <作者>吴军</作者> 
    <售价/>
  </书>
</书架>
package com.java.dom4j;
import java.io.FileOutputStream;
import java.util.List;
import org.dom4j.Branch;
import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.Node;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;

public class Dom4jDemo {
        public static void main(String[] args) throws Exception {
// 这里要导入第三方架包,右键->新建文件夹(lib),把dom4j-1.6.1.jar拷贝进来;然后选中右键->构建路径->添加到构建路径,资源下回出现“引用的库”,这时候才能点开架包使用
// 做完上面的操作,系统就会提示导入刚才加架包
// 通过saxreader获取document对象
                SAXReader reader = new SAXReader();
                Document document = reader.read("Books.xml");
// 按照XPath的方式进行操作

// 获取某个具体的节点内容,得到第一本书的售价 XPath='/书架/书/书名[1]'
//这里还要导入包 jaxen-1.1-beta-6;
                Node node = document.selectSingleNode("/书架/书/书名[1]");
                System.out.println("/书架/书/书名[1]: " + node.getText());
// 打印某节点的所有元素节点 打印第二本书的所有元素节点  XPath=/书架/书[2]/*
                List selectNodes = document.selectNodes("/书架/书[2]/*");
                for(int i=0;i<selectNodes.size();++i){
                        Element child=(Element)selectNodes.get(i);
                        System.out.println("/书架/书[2]/*: " + child.getName());
                }

//修改某个节点的主题内容   把第二本书的名字改《java编程思想》 
//XPath=/书架/书[2]/书名
                Node node2 = document.selectSingleNode("/书架/书[2]/书名");
                node2.setText("java编程思想");

//删除指定元素节点  XPath=/书架/书[2]/售价/第一版
                Node node3 = document.selectSingleNode("/书架/书[2]/售价/第一版");
                System.out.println("/书架/书[2]/售价/第一版: " + node3.getName());
                node3.detach();

// 标准的保存语句,dom4j写回文档会自动写换行方便观看
                OutputFormat format = OutputFormat.createPrettyPrint();  
// 指定XML编码                 
                format.setEncoding("utf-8");
                XMLWriter writer = new XMLWriter(new FileOutputStream ("output.xml"),format);
                writer.write(document);
                writer.close();
        }
}

猜你喜欢

转载自www.cnblogs.com/meihao1203/p/9181727.html