我获得了这个XML并要求表明表达式返回了多少元素:
<a>
<a>
<a>1</a>
<a>2</a>
</a>
<a>
<a>3</a>
<a>4</a>
</a>
</a>
XPath查询是:
i) //a[a/text()=3]/a
ii) //a[a/a/text()=3]/a/a
iii) //a[a/text()=2][a/text()=3]
给出的答案是i)2,ii)4,iii)0
但是,在尝试理解它时遇到了一些问题。对于i),
我的理解是首先检查谓词。 //一个意思是后代或者自我,这意味着我正在检查// a / a / 3。因为我在路径中得到了3,
<a>
<a>
<a>3</a>
<a>4</a>
</a>
</a>
所以谓词是真的。然后,我执行// a / a的XPath查询,它将返回2作为此块:
<a>
<a>3</a>
<a>4</a>
</a>
包含2个内部。然后对于ii),首先我检查谓词// a / a / a / 3,与上面相同,我得到了那条路径。由于谓词返回true,因此我将执行XP a查询,例如// a / a / a。但是,因为我正在考虑这个问题,所以不应该返回1:
<a>
<a>
<a>1</a>
</a>
</a>
我真的很困惑如何追踪它,我很确定我的概念是错误的,因为答案是错误的。有没有简单的方法可以做到这一点或者更好的例子?
提前致谢!
答案 0 :(得分:2)
我将尝试解释第一个XPath作为示例。阅读本答案之后,通过将您刚刚理解的内容应用到XPath的其余部分来测试您的理解。
//a
:在文档中的任何位置找到所有 a
元素。到目前为止,将返回7个元素。[a/text()=3]
:将前一个XPath找到的a
元素过滤为子元素a
,其中一个子文本节点等于3
。到目前为止,只返回一个元素; <a>3</a>
的父。/a
:从前一个XPath找到的a
元素返回子元素<a>3</a>
。这意味着整个XPath将返回2个元素,因为有两个a
元素是父项<a>3</a>
的子元素。 <强> Demo 1
强>
输出
<a>3</a>
<a>4</a>
更新:
刚刚意识到你对第二个XPath而不是第一个XPath感到困惑。但是你对第一个的理解也有些偏差,所以我希望最初的答案仍然有用。以下是关于第二个XPath的简要说明:
//a
:在文档中的任何位置找到所有 a
元素。到目前为止,将返回7个元素。[a/a/text()=3]
:谓词中的表达式将匹配<a>3</a>
的父表达式。所以到目前为止整个XPath只匹配一个元素; 根元素。/a/a
:从前一个XPath找到的根元素返回所有祖子a
元素。所以整个XPath返回4个元素 <强> Demo 2
强>