0

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

有什么想法吗?

4

1 回答 1

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

于 2012-03-13T15:56:40.350 回答