RubyでXML-RPC形式のXMLを解析する必要があります。XML-RPCサービスにアクセスできません。そのようなサービスから返されるXML文字列をそれぞれのRubyオブジェクト(ハッシュ、配列、文字列など)に変換したいだけです。
組み込みのXMLRPC(Ruby 1.9.3)をいじってみましたが、それほど遠くはありません。
require 'xmlrpc/parser'
parser = XMLRPC::XMLParser::XMLParser.new
その結果、次の例外が発生します。
LoadError: cannot load such file -- xmltreebuilder
from /Users/johannes/.rvm/rubies/ruby-1.9.3-p0/lib/ruby/site_ruby/1.9.1/rubygems/custom_require.rb:36:in `require'
from /Users/johannes/.rvm/rubies/ruby-1.9.3-p0/lib/ruby/site_ruby/1.9.1/rubygems/custom_require.rb:36:in `require'
from /Users/johannes/.rvm/rubies/ruby-1.9.3-p0/lib/ruby/1.9.1/xmlrpc/parser.rb:620:in `initialize'
from (irb):2:in `new'
from (irb):2
from /Users/johannes/.rvm/rubies/ruby-1.9.3-p0/bin/irb:16:in `<main>'
次に、さまざまなXMLParserサブクラスをインスタンス化しようとしましたが、まったく役に立ちませんでした。
これを機能させる方法について何かアドバイスはありますか?組み込みライブラリでXMLRPC::Clientを使用せずに、RPC XMLを解析することさえ可能ですか?
ありがとう!
アップデート:
これは機能しますが、非常に醜いです。これは正しくありえません:
require 'xmlrpc/client'
require "rexml/document"
xml = %{<answer>
<value>
<struct>
<member><name>test</name><value><string>hello</string></value></member>
<member><name>age</name><value><i4>12</i4></value></member>
<member>
<name>requirements</name>
<value>
<struct>
<member>
<name>confirmation</name>
<value>
<array>
<data>
<value><string>Bread</string></value>
<value><string>Butter</string></value>
</data>
</array>
</value>
</member>
<member>
<name>document</name>
<value>
<array>
<data>
<value><string>Tic</string></value>
<value><string>Tac</string></value>
<value><string>Toe</string></value>
</data>
</array>
</value>
</member>
</struct>
</value>
</member>
<member><name>width</name><value><i4>10</i4></value></member>
<member><name>height</name><value><i4>2</i4></value></member>
</struct>
</value>
</answer>}
parser = XMLRPC::XMLParser::REXMLStreamParser::StreamListener.new
parser.parse(xml)
puts "Value (accessor): '#{parser.value}'"
puts "Values (accessor): '#{parser.values}'"
puts "Value (instance_variable_get): '#{parser.instance_variable_get('@value')}'"
より良い方法があるに違いありません!
これは出力です:
Value (accessor): ''
Values (accessor): ''
Value (instance_variable_get): '{"test"=>"hello", "age"=>12, "requirements"=>{"confirmation"=>["Bread", "Butter"], "document"=>["Tic", "Tac", "Toe"]}, "width"=>10, "height"=>2}'
これは私の目を傷つけます。