Ответ 1
Как упоминалось в @pguardiario, Nokogiri является фактической библиотекой разбора XML и HTML. Если вы хотите распечатать значения Id
и Name
в вашем примере, вот как вы это сделаете:
require 'nokogiri'
xml_str = <<EOF
<THING1:things type="Container">
<PART1:Id type="Property">1234</PART1:Id>
<PART1:Name type="Property">The Name</PART1:Name>
</THING1:things>
EOF
doc = Nokogiri::XML(xml_str)
thing = doc.at_xpath('//things')
puts "ID = " + thing.at_xpath('//Id').content
puts "Name = " + thing.at_xpath('//Name').content
Несколько примечаний:
-
at_xpath
предназначен для соответствия одной вещи. Если вы знаете, что у вас несколько элементов, вы хотите использоватьxpath
. - В зависимости от вашего документа пространства имен могут быть проблематичными, поэтому вызов
doc.remove_namespaces!
может помочь (см. этот ответ для краткого обсуждения). - Вы можете использовать методы
css
вместоxpath
, если вам более удобно с ними. - Определенно играйте с этим в
irb
илиpry
, чтобы исследовать методы.
Ресурсы
Update
Чтобы обрабатывать несколько элементов, вам нужен корневой элемент, и вам нужно удалить //
в запросе xpath
.
require 'nokogiri'
xml_str = <<EOF
<root>
<THING1:things type="Container">
<PART1:Id type="Property">1234</PART1:Id>
<PART1:Name type="Property">The Name1</PART1:Name>
</THING1:things>
<THING2:things type="Container">
<PART2:Id type="Property">2234</PART2:Id>
<PART2:Name type="Property">The Name2</PART2:Name>
</THING2:things>
</root>
EOF
doc = Nokogiri::XML(xml_str)
doc.xpath('//things').each do |thing|
puts "ID = " + thing.at_xpath('Id').content
puts "Name = " + thing.at_xpath('Name').content
end
Это даст вам:
Id = 1234
Name = The Name1
ID = 2234
Name = The Name2
Если вы более знакомы с селекторами CSS, вы можете использовать этот почти идентичный бит кода:
doc.css('things').each do |thing|
puts "ID = " + thing.at_css('Id').content
puts "Name = " + thing.at_css('Name').content
end