2012-03-13 9 views
0

私はxml-object gemを使ってXMLを処理しています。私たちが受け取るXMLの中の特定の要素は、繰り返される場合とされない場合があります。一度しか表示されない場合、xml-objectはそれらを非配列プロパティとしてバインドしますが、複数回表示されると配列としてバインドされます。私はそれらが常に配列としてバインドされているかのように扱うことを好みます。これは私が話しているかを説明する必要がありますxml-objectを使って繰り返されるかもしれないxml要素を扱う方法

!/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番目の2つは失敗し、 "abc"には "baz"というメソッドはないと不平を言う。私が知る限り、 "foo.bar"の結果が配列に強制変換されると、その配列には、 "baz"というメソッドを持つ "foo.bar"によって返されたインストゥルメント文字列ではなく "プレーン"文字列が含まれます。

どのような考えですか?

答えて

0

私は、XMLを解析するために別の何かを使用しようとするだろう。 xml-object宝石で少し遊んだら、返されるオブジェクトの種類との一貫性が欠けているようです。代わりに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 

あり鋸山でのXMLObjectに類似した機能がNokogiri::Slopを経由して、同様であるが、それは同じようでしたXMLObjectと矛盾するので、代わりにNokogiri::XML().xpathを使用することにしました。

+0

ポインタありがとうございます。私はxpathでwhizではないので、私はそれを避け、純粋にオブジェクトレベルで対処したいと考えていました。しかし、あなたは何をしなければならないのですか? – jph

関連する問題