我需要在 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}'
这让我的眼睛很痛。