我正在使用xml-object gem来处理XML。我们收到的XML中的某些元素可能会也可能不会重复。当它们只出现一次时,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_ONE的形式处理xml,与XML_TWO格式的xml相同。我试过这样做:
puts [*foo.bar][0]
puts foo.bar.to_a[0]
puts [*foo.bar][0].baz
puts foo.bar.to_a[0].baz
前两行输出“abc”。第二个失败了,抱怨说“abc”上没有“baz”方法。据我所知,当“foo.bar”的结果被强制转换为数组时,该数组包含一个“普通”字符串,而不是“foo.bar”返回的已检测字符串,其中包含方法“baz”。
有什么想法吗?
答案 0 :(得分: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也有类似的功能,通过Nokogiri::Slop
,但它与XMLObject一样不一致,这就是我选择使用Nokogiri::XML().xpath
的原因。