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节点,有木有很方便!