54

私は XML を扱うのは初めてですが、ひざに落とした必要がありました。(私にとっては) 通常の XML 形式が与えられています。タグ内にコロンがあります。

<THING1:things type="Container">
  <PART1:Id type="Property">1234</PART1:Id>
  <PART1:Name type="Property">The Name</PART1:Name>
</THING1:things>

これは大きなファイルで、これだけではありませんが、この形式が誰かに親しまれていることを願っています。この種の XML ドキュメントにアプローチする方法を知っている人はいますか?

テキストを解析する力ずくの方法を書きたいだけではありませんが、REXML や Hpricot を使用して前進することができないようで、これらの異常なタグが原因であると思われます。

私のルビーコード:

    require 'hpricot'
    xml = File.open( "myfile.xml" )

    doc = Hpricot::XML( xml )

   (doc/:things).each do |thg|
     [ 'Id', 'Name' ].each do |el|
       puts "#{el}: #{thg.at(el).innerHTML}"
     end
   end

...から持ち上げたばかりです:http://railstips.org/blog/archives/2006/12/09/parsing-xml-with-hpricot/

そして、ここからいくつかのことを理解できると思いましたが、このコードは何も返しません。エラーになりません。戻るだけです。

4

2 に答える 2

85

@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_xpath1つのものを一致させるためのものです。複数のアイテムがあることがわかっている場合は、xpath代わりに使用します。
  • ドキュメントによっては、名前空間が問題になる可能性があるため、呼び出しdoc.remove_namespaces!が役立ちます (簡単な説明については、この回答を参照してください)。
  • それらに慣れている場合は、css代わりにメソッドを使用できます。xpath
  • これをいじったり、メソッドを調査しirbたりすることは間違いありません。pry

資力

アップデート

複数のアイテムを処理するには、ルート要素が必要であり//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
于 2012-06-27T05:29:08.417 に答える
44

If in a Rails environment, the Hash object is extended and one can take advantage of the the method from_xml:

xml = File.open("myfile.xml")
data = Hash.from_xml(xml)
于 2016-05-17T21:48:19.273 に答える