有人给了我这个 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
但是,我在尝试理解它时遇到了一些问题。对于我),
我的理解是首先检查谓词。//a 表示后代或自身,这意味着我正在检查//a/a/3。由于我在所述路径中得到了 3,
<a>
<a>
<a>3</a>
<a>4</a>
</a>
</a>
所以谓词为真。然后,我执行 XPath 查询,它是//a/a,它将返回 2 作为这个 block :
<a>
<a>3</a>
<a>4</a>
</a>
里面有2个。然后对于 ii),首先我检查谓词//a/a/a/3,与上面相同,我得到了那条路径。由于谓词返回 true,因此我将执行 XPath 查询,例如//a/a/a。但它不应该作为 1 返回,因为我正在看这个:
<a>
<a>
<a>1</a>
</a>
</a>
我真的很困惑如何追踪它,我很确定我的概念是错误的,因为答案是错误的。是否有任何简单的方法或更好的示例?
提前致谢!
最佳答案
我将尝试以第一个 XPath 为例进行解释。阅读此答案后测试您的理解,将您刚刚理解的内容应用到 XPath 的其余部分。
-
//a
: 找到所有a
元素,文档中的任何位置。到目前为止,将返回 7 个元素。 -
[a/text()=3]
: 过滤a
以前的 XPath 找到的元素到具有 子元素a
的元素其中一个子文本节点等于3
。到目前为止,只会返回一个元素;<a>3</a>
的父级 . -
/a
: 返回子元素a
来自<a>3</a>
以前的 XPath 找到的元素。这意味着整个 XPath 将返回 2 个元素,因为有两个a
。<a>3</a>
的父元素的子元素。
输出:
<a>3</a>
<a>4</a>
更新:
刚刚意识到您对第二个 XPath 而不是第一个感到困惑。但是您对第一个的理解也有点偏差,所以我希望最初的答案仍然有用。下面是关于第二个 XPath 的简要说明:
-
//a
: 找到所有a
元素,文档中的任何位置。到目前为止,将返回 7 个元素。 -
[a/a/text()=3]
: 谓词中的表达式将匹配<a>3</a>
的父级.所以到目前为止,整个 XPath 只会匹配一个元素; 根元素。 -
/a/a
: 从之前的 XPath 找到的根元素,返回所有的孙元素a
元素。所以整个 XPath 返回 4 个元素
关于xml - 数据库 XPath 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40561785/