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

时间:2010-08-25 20:30:44

标签: ruby xml parsing nokogiri

我正在解析一个看起来像这样的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节点。我需要能够连续地从每个节点中拉出子节点,而不是从整个文档中拉出所有相同类型的子节点。我做错了什么?

2 个答案:

答案 0 :(得分:71)

当您使用//title时,会搜索从文档根开始的所有<title>元素。使用简单title查找子标题,或.//title如果要查找标题,即使它们嵌套在其他元素中也是如此。

答案 1 :(得分:0)

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