什么是XPath
XPath:路径表达式
作用:在DOM解析XML时,通过XPath表达让解析更加简单
XPath表达式分类
- 绝对路径
- 相对路径
- 全文搜索
- 属性查找
什么是Node对象
DOM树中的每个节点就是Node
dom4j中与XPath相关的方法
注:使用XPath需要另外导入 jaxen-1.1.2.jar包
Node对象的方法 | 功能说明 |
---|---|
Node selectSingleNode(String xpath) | 通过xpath得到一个节点 |
List selectNodes(String xpath) | 通过xpath得到一组节点 |
XPath:绝对路径和相对路径
目标
- 学习XPath绝对路径的使用
- 学习XPath相对路径的使用
绝对路径语法
绝对路径示例
需求
采用绝对路径获取从根节点开始逐层的查找/contactList/contact/name 节点列表并打印信息
步骤
- 创建 XML 解析器,读取 XML 文档并获得Document对象
- 定义 Xpath 表达式:/contactList/contact/name
- 调用Document对象的selectNodes()方法执行Xpath获得节点集合
- 遍历输出每个节点
代码
public class Demo7Xpath {private Document document;//在每个测试方法之前执行的方法@Beforepublic void init() throws DocumentException {//1. 得到SaxReaderSAXReader reader = new SAXReader();//2. 得到文档对象document = reader.read(Demo7Xpath.class.getResourceAsStream("/Contact.xml"));}/**使用绝对路径*/@Testpublic void testAbsolute() {String xpath = "/contactList/contact/name";//得到所有name元素List<Node> nodeList = document.selectNodes(xpath);for (Node node : nodeList) {System.out.println(node.getText());}}
}
相对路径的语法
相对路径的示例
需求
- 先采用绝对路径获取 contactList 节点
- 再采用相对路径获取下一级contact 节点的name子节点并打印信息。
步骤
- 定义 Xpath 表达式:/contactList
- 调用Document对象的 selectSingleNode 方法执行Xpath获得根节点对象
- 通过根节点对象调用selectNodes方法执行相对路径表达式:./contact/name
- 打印输出所有的节点
代码
/**使用相对路径*/
@Test
public void testRelative() {//通过绝对路径得到/contactListNode node = document.selectSingleNode("/contactList");//通过相对路径得到nameNode nameNode = node.selectSingleNode("./contact/name");System.out.println(nameNode.getText());
}
XPath:全文搜索和属性查找
目标
-
学习XPath全文搜索的使用
-
学习XPath属性查找的使用
举例
举例 | 说明 |
---|---|
//contact | 找contact元素,无论元素在哪里 |
//contact/name | 找contact,无论在哪一级,但name一定是contact的子节点 |
//contact//name | contact无论在哪一种,name只要是contact的子孙元素都可以找到 |
全文搜索示例
需求
直接全文搜索所有的 name元素并打印
步骤
- 创建Xpath表达式 //name
- 使用selectNodes()方法查询所有的name节点
代码
/**全文搜索*/
@Test
public void testGlobalSearch() {List<Node> nodes = document.selectNodes("//name");for (Node node : nodes) {System.out.println(node.getText());}
}
属性查找语法
属性查找的示例
- 查找所有id属性节点
- 查找包括id属性的contact元素
- 查找包括id属性且属性名为的contact元素
步骤
- 创建Xpath表达式
- 使用selectNodes()方法查询所有的节点
代码
/**属性查找*/
@Test
public void testAttributeFind() {//1. 查找所有id属性节点/*List<Node> nodes = document.selectNodes("//@id");//是属性对象Attributefor (Node node : nodes) {//输出属性值Attribute a = (Attribute) node;System.out.println("属性值:" + a.getValue());}*///2. 查找包括id属性的contact元素/*List<Node> nodeList = document.selectNodes("//contact[@id]");for (Node node : nodeList) {System.out.println(node.getName());}*///3. 查找包括id属性且属性名为的contact元素Node node = document.selectSingleNode("//contact[@id=2]");System.out.println(node.getName());
}