【XML】xpath及dom4j操作xpath

前端之家收集整理的这篇文章主要介绍了【XML】xpath及dom4j操作xpath前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

xpath是啥

@H_301_3@w3school的介绍:

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

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

xpath的七种节点类型:

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

节点的关系:

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

节点的选取:

基础选取

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

@H_301_3@举例:

<?xml version="1.0" encoding="UTF-8"?>  
<book>  
    <西游记 id="x001">  
        <作者>吴承恩1</作者>  
        <作者>吴承恩2</作者>  
        <朝代>明朝</朝代>  
    </西游记>  
    <红楼梦 id="x002">  
        <作者>曹雪芹</作者>  
    </红楼梦>  
</book>
@H_301_3@1、 book:选取book下的所有节点;
2、 /book:选取根节点book;
3、 /book/西游记:选取节点book下的所有西游记节点;
4、 //book:选取所有的book下的子节点,不论这个子节点在哪儿,比如可以选到上面的西游记节点,以及西游记下的作者节点;
5、 /book//作者:选取book下的所有作者元素,不论在这个作者元素在哪儿;
6、 //@id:选取名为id的所有属性

高级选取

@H_301_3@我们直接看例子:

<?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>
@H_301_3@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、 通过竖线按多个条件选取,比如:

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

xpath的轴选取:

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

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

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

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

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

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

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

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

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

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

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

@H_301_3@12、 self:选取当前节点。

@H_301_3@例子:

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

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

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

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

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

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

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

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

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

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

dom4j使用xpath

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

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

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

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

List<Element> nodes= node.selectNodes(xpathCase);
@H_301_3@即可选到book节点下的第三个chapter节点的所有section节点,有木有很方便!


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

原文链接:https://www.f2er.com/xml/294853.html

猜你在找的XML相关文章