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"

p.xpath('//color/text()')pにはどちらか一方しか含まれていないのに、putsはどのようにして緑と黄色の両方を取得するのでしょうか。

4

1 に答える 1

1

ノードを p に分割し、<peas>それらを反復処理しているため、最初にノード自体が表示されます。

<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 に答える