在单个节点上使用 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
时,它将搜索从文档根目录开始的所有<title>
元素。只需使用title
来查找子标题,或者使用.//title
来查找标题,即使它们嵌套在其他元素中。
【讨论】:
啊哈!非常感谢。所以我将 xpath 表达式应用于节点并不重要? 将/
或//
放在前面使XPath 成为绝对路径。当您使用这些时,XPath 评估器会忽略上下文节点并从文档根目录开始。
@JohnKugelman ***.com/questions/36412067/…【参考方案2】:
从标题 xpath 表达式中删除 //。
【讨论】:
以上是关于在单个节点上使用 XPath 返回所有节点中的元素的主要内容,如果未能解决你的问题,请参考以下文章