如何处理使用xml-object可能重复或不重复的xml元素

时间:2012-03-13 15:49:29

标签: ruby-on-rails ruby xml xml-binding

我正在使用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”。

有什么想法吗?

1 个答案:

答案 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的原因。