Как получить tag.contents - PullRequest
       29

Как получить tag.contents

0 голосов
/ 21 октября 2011

У меня есть этот XML:

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

и проанализируйте его с помощью Nokogiri следующим образом:

# 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

Это неверно,Второй тег 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]
    }
}

Ответы [ 2 ]

0 голосов
/ 07 февраля 2012

Ваш 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"

Nokogiri всегда возвращает NodeSet с методами xpath, css и search, а также Node для at и его псевдонимы. Обрабатывайте NodeSet как массив.

doc.xpath('//f[@id="27"]').class # => Nokogiri::XML::NodeSet < Object
doc.at('//f[@id="27"]').class # => Nokogiri::XML::Element < Nokogiri::XML::Node
0 голосов
/ 09 ноября 2011

Я отвечу на вопрос. Этот тег, вероятно, содержит другие теги, которые вы, возможно, пропустили.

...