descendant轴用于选择指定节点的所有后代节点,语法为//node/descendant::*;2. 可通过具体节点名或谓词过滤精确选择;3. 与//区别在于descendant需指定起始节点且不包含自身;4. 使用时应注意性能,建议缩小范围并避免滥用通配符。

XPath的
descendant轴用于选择当前节点的所有后代节点,包括子节点、孙节点,以及更深层级的节点。你可以简单理解为“所有后代,一个不落”。
使用
descendant轴,可以从文档树的任何位置,向下遍历到所有层级的子节点。
如何使用XPath的descendant
轴?
descendant轴的基本语法是
//node/descendant::*。
//node
: 选择文档中所有的node
节点,这是一个起始位置。descendant::
: 指定要选择node
节点的所有后代。*
: 这是一个通配符,表示选择所有类型的后代节点。你可以用具体的节点名代替*
,例如descendant::p
选择所有的p
标签后代。
例如,假设你有如下XML文档:
Some data here More data
XPath表达式
//root/descendant::*会选择
level1、
level2、
level3、
data、
anotherLevel1、
anotherLevel2这些节点。 如果你只想选择
level2节点及其后代,可以使用
//level1/descendant::level2。
descendant
轴与//
的区别是什么?
很多人容易混淆
descendant轴和
//。 实际上,
//本身就是
descendant-or-self::node()的缩写。 这意味着
//不仅选择后代,还包括当前节点自身。
举个例子:
//p
会选择文档中所有p
元素,无论它们在文档中的位置如何。/root/descendant::p
只会选择root
元素下的所有p
元素。如果root
元素外还有p
元素,则不会被选中。
所以,
//更加灵活,可以在文档的任何位置开始查找,而
descendant轴则需要指定一个起始节点。
如何使用descendant
轴进行更精确的节点选择?
仅仅选择所有后代节点可能不够,你可能需要根据某些条件进行过滤。XPath允许你在
descendant轴中使用谓词(predicate)来实现这一点。
例如,选择所有包含特定属性的后代节点:
采用zblog修改的模板,简单方便,直接解压上传到空间即可使用,页面简单,适合SEO,导航,次导航,最新文章列表,随机文章列表全部都有,网站采用扁平结构,非常适用淘宝客类小站,所有文章都在根目录下。所有需要修改的地方在网页上各个地方都有标注说明,一切在网站后台都可以修改,无须修改任何程序代码,是新手的不二选择。后台登陆地址: 域名/login.asp用户名:admin (建议不要修改)密码:adm
//div/descendant::a[@href]
这个表达式会选择所有
div元素下的、带有
href属性的
a标签后代。
或者,选择所有文本内容包含特定字符串的后代节点:
//body/descendant::p[contains(text(), "example")]
这个表达式会选择所有
body元素下的、文本内容包含 "example" 的
p标签后代。
使用谓词可以极大地提高XPath表达式的精确性,让你能够准确地选择需要的节点。
descendant
轴的性能考量
虽然
descendant轴功能强大,但在处理大型XML文档时,需要注意其性能影响。 因为
descendant轴会遍历所有后代节点,这可能导致性能瓶颈。
一种优化方法是尽量缩小搜索范围。 例如,如果知道目标节点的大概位置,可以先选择一个较小的子树,然后再使用
descendant轴。
另外,使用更具体的节点类型代替通配符
*也可以提高性能。 例如,如果你只关心
p标签,就不要使用
descendant::*,而应该使用
descendant::p。
总之,合理使用
descendant轴,并结合谓词进行过滤,可以有效地提高XPath表达式的效率。









