0

试图让我了解 Nokogiri 和 XPath,并希望您能帮助解释这种行为。这段代码:

data = Nokogiri::XML(%{
  <veg>
    <peas>
      <color>"green"</color>
    </peas>
    <peas>
      <color>"yellow"</color>
    </peas>
  </veg>
})

data.xpath('//peas').each do |p|
  puts p                            
  puts p.xpath('color/text()')        
  puts p.xpath('//color/text()')    # output not as expected 
end

给出这个输出:

<peas>
  <color>"green"</color>
</peas>

"green"

"green"
"yellow"

<peas>
  <color>"yellow"</color>
</peas>

"yellow"

"green"
"yellow"

puts 如何p.xpath('//color/text()')最终检索到绿色和黄色,而 p 只包含其中一个?

4

1 回答 1

1

由于它将<peas>节点分解为 p 并遍历它们,因此它首先显示节点本身

<peas>
  <color>"green"</color>
</peas>

<peas>
  <color>"yellow"</color>
</peas>

然后<color>是每个 p 的节点文本。

然后,我们到达//color/text(),并且 ' //' 表示从根开始,并获取所有<color>节点以及text()与它们相关联的节点,这就是为什么你会同时获得绿色和黄色的颜色,即使<peas>分别迭代每个节点也是如此。

再举一个例子,如果我们迭代到 node veg/peas[color='green'],然后说 find //peas,我们将返回<peas>黄色和绿色的两个节点。

color/text()说“从当前节点开始,获取子节点的文本<color>”并//color/text()说“给我<color>XML 中所有节点的文本,无论当前位置如何”

如果我需要澄清任何事情,请告诉我...

于 2012-12-21T16:17:59.543 回答