1

我在尝试使用库将 XML 文件解析为类似对象的哈希,修改它,然后将其打印回 Ruby 中的另一个 XML 文件时遇到了很糟糕的事情。对于我正在学习的课程,我们应该使用类似 Java JAXB 的库,在其中我们将 XML 转换为对象。我们已经完成了 SAX 和 DOM 方法,因此我们不能使用这些 XML 反序列化方法。Nokogiri 在 Ruby 中帮助我解决了这两个问题。

唯一的问题是,除了我对对象进行的简单修改之外,当我写入文件时,它有很大的不同。是否有专门用于执行此操作的 Ruby 库?我尝试过:ROXML、XML::Mapping 和 ActiveSupport::CoreExt。我唯一可以运行的是 ActiveSupport,即使这样,它也会开始将元素属性作为子元素放入输出 XML 中。

我愿意尝试 XmlSimple,但我很好奇有没有人真的必须这样做之前/遇到同样的问题?同样,我不能像 SAX 那样一次读取一行,也不能像 DOM 那样构建树状结构,它需要是像对象一样的散列。

任何帮助深表感谢!

4

2 回答 2

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)
于 2012-04-10T07:46:51.943 回答
1

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

# 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)

我希望这可以帮助别人。还要确保你注意这个宝石的大小写和连字符!!!

于 2012-04-13T01:49:54.113 回答