【XML】xpath及dom4j操作xpath

xpath是啥

w3school的介绍:

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

我的理解为xpath就是每个标签节点的路径。

xpath的七种节点类型:

元素、属性、文本、命名空间、处理指令、注释以及文档节点(或称为根节点)

节点的关系:

父、子、同胞、先辈、后代

节点的选取:

基础选取

1、 节点名: 选取此节点的所有子节点。
2、 /节点名: 从根节点选取。
3、 // 从匹配选择的当前节点选择文档中的节点,而不考虑它们的位置。
4、 . 选取当前节点。
5、 .. 选取当前节点的父节点。
6、 @ 选取属性。

举例:

<?xml version="1.0" encoding="UTF-8"?>  
<book>  
    <西游记 id="x001">  
        <作者>吴承恩1</作者>  
        <作者>吴承恩2</作者>  
        <朝代>明朝</朝代>  
    </西游记>  
    <红楼梦 id="x002">  
        <作者>曹雪芹</作者>  
    </红楼梦>  
</book>

1、 book:选取book下的所有节点;
2、 /book:选取根节点book;
3、 /book/西游记:选取节点book下的所有西游记节点;
4、 //book:选取所有的book下的子节点,不论这个子节点在哪儿,比如可以选到上面的西游记节点,以及西游记下的作者节点;
5、 /book//作者:选取book下的所有作者元素,不论在这个作者元素在哪儿;
6、 //@id:选取名为id的所有属性

高级选取

我们直接看例子:

<?xml version="1.0" encoding="UTF-8"?>  
<books>  
    <book id="x001">  
        <作者>吴承恩1</作者>  
        <作者>吴承恩2</作者>  
        <朝代>明朝</朝代> 
        <price>56.00</price> 
    </book>  
    <book id="x002">  
        <作者>曹雪芹</作者>  
        <price>33.00</price> 
    </book>  
</books>

1、 /books/book[1] 选取属于 books 子节点的第一个 book 元素。
2、 /books/book[last()] 选取属于 books 子节点的最后一个 book 元素。
3、 /books/book[last()-1] 选取属于 books 子节点的倒数第二个 book 元素。
4、 /books/book[position()<3] 选取最前面的两个属于 books 元素的子节点素的 book 元素。
5、 //book[@id] 选取所有拥有名为id 属性的 book元素。
6、 //title[@id=’x001’] 选取所有 book 元素,且这些元素拥有值为x001 的 id 属性。
7、 /books/book[price>35.00] 选取 books元素的所有 book 元素,且其中的 price 元素的值须大于 35.00。
8、 /books/book[price>35.00]/作者 选取 bookstore 元素中的 book 元素的所有 作者 元素,且其中的 price 元素的值须大于 35.00。
9、 通过竖线按多个条件选取,比如:

//book/作者 | //book/price:选取 book 元素的所有 作者 和 price 元素。

xpath的轴选取:

1、 ancestor:选取当前节点的所有先辈(父、祖父等)

2、 ancestor-or-self:选取当前节点的所有先辈(父、祖父等)以及当前节点本身

3、 attribute:选取当前节点的所有属性

4、 child:选取当前节点的所有子元素。

5、 descendant:选取当前节点的所有后代元素(子、孙等)。

6、 descendant-or-self:选取当前节点的所有后代元素(子、孙等)以及当前节点本身。

7、 following:选取文档中当前节点的结束标签之后的所有节点。

8、 namespace:选取当前节点的所有命名空间节点

9、 parent:选取当前节点的父节点。

10、 preceding:选取文档中当前节点的开始标签之前的所有节点。

11、 preceding-sibling:选取当前节点之前的所有同级节点。

12、 self:选取当前节点。

例子:

child::book:选取所有属于当前节点的子元素的 book 节点

attribute::lang:选取当前节点的 lang 属性

child::*:选取当前节点的所有子元素

attribute::*:选取当前节点的所有属性

child::text():选取当前节点的所有文本子节点

child::node():选取当前节点的所有子节点

descendant::book:选取当前节点的所有 book 后代

ancestor::book:选择当前节点的所有 book 先辈

ancestor-or-self::book:选取当前节点的所有book先辈以及当前节点(假如此节点是book节点的话)

child::*/child::price:选取当前节点的所有 price 。

dom4j使用xpath

1、引入名为jaxen的jar包
2、我们看一下dom4j的xpath格式,选中一个节点后,通过node.getPath()获取这个节点的xpath,发现是这样的:

/[name()=’book’]/[name()=’chapter’]/*[name()=’section’]

既然dom4j要求这种格式,我们在通过xpath操作节点时就用这种格式好了,
比如:

String xpathCase=
"/*[name()='book']/*[name()='chapter'][3]/*[name()='section']";

List<Element> nodes= node.selectNodes(xpathCase);

即可选到book节点下的第三个chapter节点的所有section节点,有木有很方便!

xml仍然是数据表示的优秀格式,很多json无法取代的地方,甚至也作为nosql的存储格式,值的我们好好学习!

相关文章

php输出xml格式字符串
J2ME Mobile 3D入门教程系列文章之一
XML轻松学习手册
XML入门的常见问题(一)
XML入门的常见问题(三)
XML轻松学习手册(2)XML概念