2011-10-21 8 views
0

偽のデータを返します。鋸山 - tag.contentsは、私は、このXMLを持って

<record> 
    <f id="27">John Smith</f> 
    <f id="28"/> 
</record> 

私は鋸山でこのようにそれを解析:

# I get the record from the whole document 
... 
fields = record.xpath("f") 
for field in fields 
    puts field.content 
end 

戻り、この:

John Smith 
\n 28 \n 

です間違っている。 2番目のfieldタグはタグ内に何も持っていませんが、空の値を返します。右?どんな助け?

ところで、LibXMLでも同じことが起こります。

編集:

実際のコード:

xml = Nokogiri::XML("<?xml version="1.0" ?><records><record><f id="27">John Smith</f><f id="38"/></record></records>") 

records = xml.xpath("//record") 
records.map{|record| 
    fields = record.xpath("f") 
    fields.to_enum(:each_with_index).collect{|field,index| 
     [field.content, index] 
    } 
} 
+1

私にとっては(xpathを '// f'に変更して)奇妙です。 「レコード」の作成方法を教えてください。また、Ruby for-loopsは非常に非慣用的であることに注意してください(それぞれEnumerable#を代わりに使用してください) – tokland

+0

'records'変数もあり、' records.each {| record | ...} 'と' records'は 'SOMEXML.xpath(" // record ")'から来ます。私は実際にはforループではなく、それぞれを使用します。 –

+0

正確な(ただし最短の)XMLと問題を再現するコードを貼り付けるほうが簡単です。 – tokland

答えて

0

私は疑問にお答えします。タグにはおそらく、あなたが見逃していたかもしれない他のタグが含まれています。

+0

これは正しくありません。 –

0

あなたのXPathアクセサは間違っている:

require 'nokogiri' 

doc = Nokogiri::XML(<<EOT) 
<record> 
    <f id="27">John Smith</f> 
    <f id="28"/> 
</record> 
EOT 

puts doc.xpath('f').size # => 0 
puts doc.xpath('//f').size # => 2 

puts doc.xpath('//f[@id="27"]').size # => 1 
puts doc.xpath('//f[@id="27"]').first.text # => "John Smith" 
puts doc.at('//f').text # => "John Smith" 

鋸山は常にxpathcsssearchメソッドを持つノードセット、およびatためのノードとその別名を返します。 NodeSetを配列として扱います。

doc.xpath('//f[@id="27"]').class # => Nokogiri::XML::NodeSet < Object 
doc.at('//f[@id="27"]').class # => Nokogiri::XML::Element < Nokogiri::XML::Node 
関連する問題