在单个节点上使用 XPath 返回所有节点中的元素

Posted

技术标签:

【中文标题】在单个节点上使用 XPath 返回所有节点中的元素【英文标题】:Using XPath on single node returns elements in all nodes 【发布时间】:2011-04-03 22:53:54 【问题描述】:

我正在解析一个看起来像这样的 XML 文档:

<MyBook>
   <title>Favorite Poems</title>
   <issn>123-456</issn>
   <pages>45</pages>
</MyBook>
<MyBook>
   <title>Chocolate Desserts</title>
   <issn>654-098</issn>
   <pages>100</pages>
</MyBook>
<MyBook>
   <title>Jabberwocky</title>
   <issn>454-545</issn>
   <pages>19</pages>
</MyBook>

我使用 xpath 拉出 MyBook 节点并像这样遍历它们:

xmldoc.xpath("//MyBook").each do |node|
   mytitle=node.xpath("//title").text
   puts mytitle
end

输出如下所示:

Favorite PoemsChocolateDessertsJabberwocky
Favorite PoemsChocolateDessertsJabberwocky
Favorite PoemsChocolateDessertsJabberwocky

好像节点真的是整个 xmldoc。但是,如果我打印出迭代器中的节点,每次都是我所期望的,只有一个 MyBook 节点。我需要能够连续地从每个节点中提取子节点,而不是从整个文档中提取所有相同类型的子节点。我做错了什么?

【问题讨论】:

【参考方案1】:

当您使用//title 时,它将搜索从文档根目录开始的所有&lt;title&gt; 元素。只需使用title 来查找子标题,或者使用.//title 来查找标题,即使它们嵌套在其他元素中。

【讨论】:

啊哈!非常感谢。所以我将 xpath 表达式应用于节点并不重要? /// 放在前面使XPath 成为绝对路径。当您使用这些时,XPath 评估器会忽略上下文节点并从文档根目录开始。 @JohnKugelman ***.com/questions/36412067/…【参考方案2】:

从标题 xpath 表达式中删除 //。

【讨论】:

以上是关于在单个节点上使用 XPath 返回所有节点中的元素的主要内容,如果未能解决你的问题,请参考以下文章

Xpath总结

爬虫 xpath

XPATH之normalize-space(.)和normalize-space(text())区别

Xpath基础

XPath可以只返回具有X子节点的节点吗?

通过xpath相对节点位置查找元素