xml - 数据库 XPath 查询

标签 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

但是,我在尝试理解它时遇到了一些问题。对于我),

我的理解是首先检查谓词。//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>父元素的子元素

Demo 1

输出:

<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 个元素

Demo 2

关于xml - 数据库 XPath 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40561785/

相关文章:

python - 将 MYSQL 表转储到 CSV 的最佳方法是什么?

xml - XPath如何动态创建属性的路径

xml - 使用XSLT将XML转换为CSV

xml - 列出元素 XSLT 的子节点

java - 将xml文件数据存储在DB中

java - 如何使用 MongoDB 中的 Criteria 进行投影?

php - 如果存在两行且值等于,则从数据库获取值

xml - 为什么XPath的节点测试node()不返回属性Nodes?

html - 即使映射,我也无法访问 servlet

android - 使用 LayoutInflater 创建动态 View