我正在尝试使用库将XML文件解析为类似哈希的对象,修改它,然后将其打印回Ruby中的另一个XML文件。对于我正在学习的类,我们应该使用类似Java JAXB的库,我们将XML转换为对象。我们已经完成了SAX和DOM方法,所以我们不能使用那些XML反序列化方法。 Nokogiri在Ruby中帮助我完成了这两项工作。
唯一的问题是,除了我对对象进行的SIMPLE修改之外,当我写入文件时,它有很大的差异。有没有一个Ruby库可以做到这一点?我尝试过:ROXML,XML :: Mapping和ActiveSupport :: CoreExt。我甚至可以运行的唯一一个是ActiveSupport,即使这样,它也会开始将元素属性作为子元素放在输出XML中。
我愿意尝试使用XmlSimple,但我很好奇有没有人在遇到同样的问题之前必须这么做?同样,我不能像SAX一样一行读取一行,或者像DOM那样构建类似树的结构,它需要像对象那样的散列。
非常感谢任何帮助!
答案 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)
# 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)
我希望这有助于某人。还要确保你注意这个宝石的表壳和连字符!!!