数据库XPath查询

时间:2016-11-12 10:12:45

标签: xml database xpath

我获得了这个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>

我真的很困惑如何追踪它,我很确定我的概念是错误的,因为答案是错误的。有没有简单的方法可以做到这一点或者更好的例子?

提前致谢!

1 个答案:

答案 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