Nokogiri:嵌套的xpath如何访问外部循环?

时间:2012-12-21 16:05:51

标签: ruby xpath nokogiri

试图绕过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"

put p.xpath('//color/text()')如何最终检索绿色和黄色,而p只包含一个或另一个?

1 个答案:

答案 0 :(得分:1)

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

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

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

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

然后,我们转到//color/text(),“//”表示从根开始,获取所有<color>个节点,以及与它们关联的text(),这就是为什么你得到绿色和黄色的原因,即使在分别遍历每个<peas>节点时也是如此。

所以另一个例子,如果我们迭代到节点veg/peas[color='green'],然后说找到//peas,我们会收回黄色和绿色的两个<peas>节点。

color/text()说“从当前节点开始,然后抓住子节点<color>的文本” 并且//color/text()说“无论当前位置如何,都给我XML中所有<color>个节点的文本”

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