试图绕过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只包含一个或另一个?
答案 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>
个节点的文本”
如果我需要澄清任何事情,请告诉我......