dom4j和XPath的基本用法
Dom4j 和XPath的基本用法
dom4j
dom4j是一个解析xml的工具,它提供了读写xml的api。这里只介绍它读取xml的方式。
1.dom4j基本的使用
首先我们需要导入dom4j的包,jar包地址:
如果使用的maven工程,下面是maven坐标:
<dependency> <groupId>dom4j</groupId> <artifactId>dom4j</artifactId> <version>1.6.1</version> </dependency>
2.获取xml文档对象
// 获取文档对象 SAXReader reader = new SAXReader(); Document doc = reader.read(new FileInputStream("xml/demo.xml")); // 获取根节点 Element root = doc.getRootElement();
3.Element 的常用方法
* 得到标签上指定属性的值: attributeVale(String name);
* 得到标签下的标签: - 获取标签的所有直接子标签 List elements(); - 获取标签的第一个直接子标签(指定标签名) Element element(String name); 还有一个版本是 Element element(QName qName); - 获取标签的所有直接子标签(指定标签名) Element elements(String name);
本次操作的xml文档
<?xml version="1.0" encoding="utf-8"?> <classroom grade="primary5"> <persons> <teacher id="1"> <property name="name" value="laosi"/> <property name="age" value="24"/> </teacher> <students> <student id="1"> <property name="name" value="lisi"/> <property name="age" value="12"/> </student> <student id="2"> <property name="name" value="zhangsan"/> <property name="age" value="12"/> </student> <student id="3"> <property name="name" value="wangwu"/> <property name="age" value="12"/> </student> </students> </persons> </classroom>
XPath
XPath 是xml的路径语言,使用路径表达式来操作xml文档,使用XPath操作xml文档更加便捷。
使用XPath,我们还需要导入一个依赖包
1.XPath的基本使用
dom4j提供了两个方法支持XPath搜索:
* List selectNodes(String expr);
* Node selectSingleNode(String expr);
我们首先还是获取Document对象,因为以上两个搜索方法都是Document的方法。
2.Xpath表达式的几种写法
第一种形式: /AAA/BBB/CCC:表示层级结构,表示AAA下面BBB下面的所有CCC 第二种形式: //BBB:选择文档中所有的BBB元素 第三种形式: /AAA/BBB/*:选择目录下的所有元素 /*/*/*/BBB:选择有三个祖先元素的BBB元素 //*:选择所有的元素 第四种形式: //AAA[1]/BBB:选择第一个AAA下的BBB元素 //AAA/BBB[1]:选择所有AAA的第一个BBB元素 //AAA/BBB[last()]:选择所有AAA的最后一个BBB元素 第五种形式: //@id:选择所有的id属性 //BBB[@id]:选择具有id属性的BBB元素 第六种形式: //BBB[@id=b1] :选择含有属性id并且其值为b1的BBB元素
3.路径的问题
如果我们的XPath表达式以 "/" 开头,那么表示相对于整个文档进行搜索; 如果我们的XPath表达式以结点(标签)名开头,那么表示相对于调用搜索方法的结点进行搜索; 举个例子: // 首先我们拿到了student的父标签 students Node students = doc.selectSingleNode("/classroom/persons/students"); // 以下两种方式搜索的结果是相同的 List<?> list1 = students.selectNodes("/classroom/persons/students/student"); // 以 "/" 开头 List<?> list2 = students.selectNodes("student"); // 以标签名开头