这些在xpath中有什么区别?

时间:2015-04-29 08:12:18

标签: xml xpath domxpath

我是xpath的新手,任何人都可以让我详细了解xpath中/bookstore/*/bookstore之间的区别吗?

让我们说这是示例输入

<bookstore>
    <book>
      <title lang="en">Harry Potter</title>
      <price>29.99</price>
    </book>
    <book>
      <title lang="en">Learning XML</title>
      <price>39.95</price>
    </book>
</bookstore>

<bookstore>

    <book>
      <title lang="en">Harry Potter1</title>
      <price>29.999</price>
    </book>

    <book>
      <title lang="en">Learning XML1</title>
      <price>39.955</price>
    </book>

</bookstore>

两种情况下都会输出什么? 提前谢谢。

2 个答案:

答案 0 :(得分:1)

假设以下简单的输入文档:

<bookstore>
   <book/>
   <book/>
</bookstore>

现在,表达式

/bookstore

装置

  

选择名为bookstore的元素,但前提是它是文档的最外层元素

格式良好的XML 1 中只能有一个最外层的元素,因此上面的路径表达式最多只能选择一个元素节点。

/bookstore/*

装置

  

选择名为bookstore的元素,但前提是它是文档的最外层元素。然后,选择所有直接子元素,无论其名称如何。

1 正如迈克尔凯指出的那样,除了你以编程方式构建XML树。然后,可能有多个最外层的元素。

  

然后在/ bookstore / * out的情况下,wil不包含<bookstore></bookstore>

我可以通过两种方式阅读这个问题。

为什么同时为<element></element>

<bookstore></bookstore>视为 one,single element 。它们是该元素的开始和结束标记。将输入文档读入内存后,它将存储在树状结构(例如DOM)中,没有开始和结束标记。正是这种表示法是对你的XPath表达式进行评估。

但是,如果输出评估XPath表达式的结果,那么结果树将再次序列化,并且标签会重新出现 - 这可能会造成混淆。

是否已选择路径中提到的所有元素?

不,在像

这样的表达式中
/bookstore/book

仅选择book个元素节点。仅选择最后一个 axist步骤之后的最右边的项目(/parent::之类的内容)。

答案 1 :(得分:0)

表达式/bookstore/*将选择子项,/bookstore将选择节点本身。

例如,/bookstore/*会在/bookstore下选择所有子元素,因此您最终可能会得到一系列元素。请注意,如果这是一个更复杂的表达式,如/bookstore/book/*,并且有多个/bookstore/book元素,则会选择所有匹配节点的所有子节点。

表达式/bookstore将仅选择元素/bookstore。与上述类似,如果元素位于/bookstore/book之类的路径上,则此类选择可能会产生元素集合。