XPath查询字符串仅在根元素的直接子元素上搜索文本?

时间:2016-06-26 14:51:08

标签: xml xpath

我刚拿起XPath,并试图让我的查询工作,但不知怎的,它没有拿起我想要的元素。

XML示例:

<?xml version="1.0" encoding="UTF-8"?>
<d:data xmlns:d="defiant-namespace" d:constr="Array" d:mi="8">
  <d:item d:mi="2">
    <name d:constr="String" d:mi="1">Asian Winged Bean</name>
  </d:item>
  <d:item d:mi="7">
    <image d:mi="5">
      <name d:constr="String" d:mi="3">wbss-1a20ed37-e498-47ad-b97d-c36c4d653b66-mps4YI4gNB</name>
      <url d:constr="String" d:mi="4">http://dropbox.com/7f3f1192-191e-41a6-8bcd-47ab1d30af3b/wbss-1a20ed37-e498-47ad-b97d-c36c4d653b66-mps4YI4gNB</url>
    </image>
    <name d:constr="String" d:mi="6">Akha Striped Bean</name>
  </d:item>
</d:data>

我的查询是

//*[contains(name,"w")]

获取第一个<item>,但它也会选择我不想要的<image>元素。有没有办法只在顶级元素而不是他们的孩子上搜索文本?

2 个答案:

答案 0 :(得分:2)

您的回答在技术上是正确的,但现在却没有用。为了使其有用,它将以类似于以下的方式改变:

/*/*[contains(name,"W")]

//*替换/*/*意味着我们只会遍历文档根目录的一个级别(即规范&#34;顶级&#34;)。

顺便说一下 - 如果你知道你的类型,你应该考虑避免/*;使用此构造可防止使用元素类型的索引,从而防止某些常见的引擎优化(在对索引文档进行操作时)用于加速查询。

假设您将一些本地等效的{d: "defiant-namespace"}作为命名空间映射传递给XPath引擎(我们无法在不知道您的编程语言,XPath库和&amp; c的情况下告诉您如何操作的操作),从绩效的角度来看,你从以下方面做得更好:

/d:data/d:item[contains(name, "W")]

答案 1 :(得分:1)

改变这个:

//*[contains(name,"w")]

到这个

/*[contains(name,"w")]

&#34; //&#34;递归搜索xml树, &#34; /&#34;只查看根节点