Ruby on rails 如何像Nokogiri gem一样使用Ox gem打开、解析和处理XML文件?

Ruby on rails 如何像Nokogiri gem一样使用Ox gem打开、解析和处理XML文件?,ruby-on-rails,ruby,xml,nokogiri,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').tex

我想打开一个外部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
现在我想试试OxGem()(可能更快),但我不知道如何打开和处理纪录片中的文件

以上代码的任何等效代码示例都将非常棒!谢谢大家!

来自:

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

如果您的XML文件是UTF-8编码的,或者:

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

不能使用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    
xml=Ox.parse(%Q){
例1
例2
}(条)
locate('Element/foo/^Text')。每个|
@data=Model.new(:attr=>t)
@数据保存
结束
#或者如果您需要先对元素执行其他操作
locate('Element')。每个do | elem|
#做事
@data=Model.new(:attr=>elem.locate('foo/^Text')。首先)
@数据保存
结束

如果查询没有找到任何匹配项,它将返回一个空数组。有关
locate
查询参数的简要说明,请参阅位于的源代码。

感谢您的快速回复。到目前为止,Open和parse是有效的”但是我如何像“xml.xpath('//Element')那样浏览内容呢?每个“-xpath都不能像doc.xpath那样工作……我没有把这看作是你最初问题的一部分。你基本上是在问,“我如何使用Ox,比如,所有的Ox?”?“我不会回答这个问题,因为IMHO现在已超出堆栈溢出的范围。您似乎没有阅读文档,也没有亲自尝试解决这个问题。@Phrogz,公平地说@Bob,文档不多,尤其是
locate
方法。我只能在
lib/Ox/element.rb
文件中找到Ox使用的自定义查询语言的解释。@kardeiz我不知道,对我来说似乎是合理的。@Phrogz,观点很好,我同意文档是合理的。但是该页面在Github页面上的点击次数很多,而且
Element
是否是可以查看的地方并不明显。定位节点是解析XML的一个非常重要的部分,因此如果作者在自述文件中提到
locate
,并可能链接到文档(因为使用了自定义查询语言),那就太好了。我不知道Ox。它似乎比Nokogiri快。牛有可能会接管Nokogiri吗?可能不会。Ox速度非常快,但只支持Nokogiri提供的一小部分功能。例如,如果您需要XPath支持、适当的命名空间支持、XSLT等,那么Ox实际上不是一个有效的选项。并不是贬低Ox的价值——它只是有一个更有限的应用。
doc = Ox.parse( File.open(filename,"r:UTF-8",&:read) )
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