如何从XML构建Object,修改,然后在Ruby中写入File

时间:2012-04-10 02:51:41

标签: ruby xml parsing hash

我正在尝试使用库将XML文件解析为类似哈希的对象,修改它,然后将其打印回Ruby中的另一个XML文件。对于我正在学习的类,我们应该使用类似Java JAXB的库,我们将XML转换为对象。我们已经完成了SAX和DOM方法,所以我们不能使用那些XML反序列化方法。 Nokogiri在Ruby中帮助我完成了这两项工作。

唯一的问题是,除了我对对象进行的SIMPLE修改之外,当我写入文件时,它有很大的差异。有没有一个Ruby库可以做到这一点?我尝试过:ROXML,XML :: Mapping和ActiveSupport :: CoreExt。我甚至可以运行的唯一一个是ActiveSupport,即使这样,它也会开始将元素属性作为子元素放在输出XML中。

我愿意尝试使用XmlSimple,但我很好奇有没有人在遇到同样的问题之前必须这么做?同样,我不能像SAX一样一行读取一行,或者像DOM那样构建类似树的结构,它需要像对象那样的散列。

非常感谢任何帮助!

2 个答案:

答案 0 :(得分:1)

你应该看看nokogiri:http://nokogiri.org/

然后你可以像这样解析XML:

xml_file = "some_path"
@xml = Nokogiri::XML(File.open xml_file)
@xml.xpath('//listing').each do |node| 
  style  = node.search("style").text
end

使用Xpath,您可以在XML中执行查询:

@xml.xpath("//listing[name='John']").first(10)

答案 1 :(得分:1)

好的,我明白了。在查看ActiveSupport :: CoreExt的源代码后,我发现它只使用了一个名为xml-simple的gem。什么令人讨厌的是require语句中的gem,库名称,类名是连字符和非连字符拼写的混合。为了将来的参考,这是我做的:

# gem install xml-simple
#             ^ all lowercase, hyphenated
require 'xmlsimple'
#        ^ all lowercase, not hyphenated
doc = XmlSimple.xml_in 'hw3.xml', 'KeepRoot' => true
#     ^ Camel cased (it's a class), not hyphenated
# doc.class => Hash
# manipulate doc as a hash
file = File.new('HW3a.xml', 'w')
file.write("<?xml version='1.0' encoding='utf-8'?>\n")
file.write(XmlSimple.xml_out doc, 'KeepRoot' => true)

我希望这有助于某人。还要确保你注意这个宝石的表壳和连字符!!!