如何使用与Nokogiri gem一样的Ox gem打开,解析和处理XML文件?

时间:2014-02-14 17:41:03

标签: ruby-on-rails ruby xml nokogiri

我想打开外部XML文件,解析它并使用数据存储在我的数据库中。我和Nokogiri很容易做到这一点:

file = '...external.xml'
xml = Nokogiri::XML(open(file))

xml.xpath('//Element').each do |element|
  # process elements and save to Database e.g.:
  @data = Model.new(:attr => element.at('foo').text)
  @data.save      
end

现在我想尝试(可能更快)Ox gem(https://github.com/ohler55/ox) - 但我不知道如何从纪录片中打开和处理文件。

上述代码的任何等效代码示例都很棒!谢谢!

2 个答案:

答案 0 :(得分:8)

您无法使用XPath在Ox中定位节点,但Ox确实提供了locate方法。您可以像这样使用它:

xml = Ox.parse(%Q{
  <root>
    <Element>
      <foo>ex1</foo>
    </Element>
    <Element>
      <foo>ex2</foo>
    </Element>
  </root>
}.strip)

xml.locate('Element/foo/^Text').each do |t|
  @data = Model.new(:attr => t)
  @data.save      
end

# or if you need to do other stuff with the element first
xml.locate('Element').each do |elem|
  # do stuff
  @data = Model.new(:attr => elem.locate('foo/^Text').first)
  @data.save      
end    

如果您的查询未找到任何匹配项,则会返回一个空数组。有关locate查询参数的简要说明,请参阅element.rb上的源代码。

答案 1 :(得分:0)

来自the documentation

doc2 = Ox.parse(xml)

要在Ruby中读取文件的内容,您可以使用xml = IO.read('filename.xml')(以及其他)。所以:

doc = Ox.parse(IO.read(filename))

如果您的XML文件是UTF-8编码,则可选:

doc = Ox.parse( File.open(filename,"r:UTF-8",&:read) )