0

xml-objectgemを使用してXMLを処理しています。私たちが受け取るXMLの特定の要素は、繰り返される場合と繰り返されない場合があります。それらが1回だけ表示される場合、xml-objectはそれらを非配列プロパティとしてバインドしますが、複数回表示される場合、それらは配列としてバインドされます。私はそれらを常に配列としてバインドされているかのように扱いたいと思います。これは私が話していることを説明するはずです:

!/usr/bin/env ruby
require 'rubygems'
require 'xml-object'

XML_ONE = <<END
<foo>
  <bar baz="123">abc</bar>
</foo>
END

foo = XMLObject.new(XML_ONE)
puts foo.bar
puts foo.bar.baz

XML_TWO = <<END
<foo>
  <bar baz="123">abc</bar>
  <bar baz="456">def</bar>
</foo>
END

foo = XMLObject.new(XML_TWO)
puts foo.bar[0]
puts foo.bar[0].baz

私がやりたいのは、XML_TWO形式のxmlと同じようにXML_ONE形式のxmlを処理することです。私はこれをやってみました:

puts [*foo.bar][0]
puts foo.bar.to_a[0]
puts [*foo.bar][0].baz
puts foo.bar.to_a[0].baz

最初の2行は「abc」を出力します。次の2つは失敗し、「abc」にメソッド「baz」がないことを訴えます。私の知る限り、「foo.bar」の結果が配列に強制変換されると、その配列には「plain」文字列が含まれ、メソッド「baz」を持つ「foo.bar」によって返されるインストルメント化された文字列は含まれません。

何かご意見は?

4

1 に答える 1

0

XMLを解析するために別の何かを使用しようとします。xml-object gemで少し遊んだ後、返されるオブジェクトのタイプとの一貫性が欠けているようです。代わりに使用Nokogiriします。私はあなたがこのコードで試みていた振る舞いを得ることができました:

#!/usr/bin/env ruby
require 'rubygems'
require 'xml-object'
require 'nokogiri'

XML_ONE = <<END
<foo>
  <bar baz="123">abc</bar>
</foo>
END

XML_TWO = <<END
<foo>
  <bar baz="123">abc</bar>
  <bar baz="456">def</bar>
</foo>
END

xml1 = Nokogiri::XML(XML_ONE)
xml2 = Nokogiri::XML(XML_TWO)

puts xml1.xpath('/foo/bar/@baz')[0]
puts xml2.xpath('/foo/bar/@baz')[1]

結果:

123
456

NokogiriのXMLObjectにも同様の機能がありますが、XMLObjectとNokogiri::Slop同じように一貫性がなかったため、代わりに使用することにしましNokogiri::XML().xpathた。

于 2012-03-13T15:56:40.350 に答える