Dom4j中使用XPath
dom4j
dom4j是一个解析xml的工具,它提供了读写xml的api。这里只介绍它读取xml的方式。
1.dom4j基本的使用
首先我们需要导入dom4j的包,jar包地址:dom4jjar包
如果使用的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,我们还需要导入一个依赖包,http://central.maven.org/maven2/jaxen/jaxen/1.1-beta-6/jaxen-1.1-beta-6.jar
1.XPath的基本使用
dom4j提供了两个方法支持XPath搜索:
-
List selectNodes(String expr);
-
Node selectSingleNode(String expr);
我们首先还是获取Document对象,因为以上两个搜索方法都是Document的方法。
获取Node结点后,强转为它的子类Element即可使用
List<Element> fields = ((Element)node).element("field");
for(Element field : fields){
field.attribute("xx").getText()
}
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");
// 以标签名开头
4.其它语法
<?xml version="1.0" encoding="utf-8"?>
<A>
<B>
<C D='xx'></C>
</B>
</A>
包含关系
/A/B/C[contains(@D,'xx')]
————————————————
版权声明:本文为优快云博主「迷茫中前进」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.youkuaiyun.com/qq_40650532/article/details/90230238