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();
}
}
|