显然,我需要(a)将两个字符串转换为canonical XML或(b)比较它们的解析树。以下操作无效,因为返回的文档对象没有明确的==
定义。
Nokogiri.XML(doc_a) == Nokogiri.XML(doc_b)
以下也没有,因为Nokogiri的to_xml
留下了一些内部空白:
Nokogiri.XML(doc_a).to_xml == Nokogiri.XML(doc_b).to_xml
这是一个合理的近似平等(并且适用于大多数情况),但它并不完全正确:
Nokogiri.XML(doc_a).to_xml.squeeze(' ') == Nokogiri.XML(doc_b).to_xml.squeeze(' ')
我已经在使用Nokogiri了,所以我更愿意坚持使用它,但我会使用任何库。
答案 0 :(得分:12)
实际上有几个很好的基于Nokogiri的库用于检查XML树的等效性,包括equivalent-xml或nokogiri-diff,这可能会有所帮助。
我更喜欢等效的xml,因为它提供了更多的灵活性(可能以严格为代价?),允许你比较或不考虑元素顺序或空格。
答案 1 :(得分:4)
如果您正在寻找结构相等而不关心标签和属性的顺序,那么xml-simple库可能是一个不错的选择。它将xml转换为ruby的数据结构(散列和列表),可以安全地与==
运算符进行比较。
答案 2 :(得分:1)
将它们转换为字符串将不会非常成功。例如,如果一个元素有两个属性,那么顺序真的重要吗?在大多数情况下,没有。给定节点的子节点顺序?取决于你在做什么。但如果其中一个问题的答案是“不”,那么简单的字符串比较就是最好的。
Nokogiri没有为你做这件事;你必须自己建造它。亚伦帕特森discusses some of the issues here:
就XML文档而言 有关,从来没有两个节点 等于。文档中的每个节点都是 不同。每个节点都有很多 要比较的属性:
- 这个名字是一样的吗?
- 属性怎么样?
- 名称空间怎么样?
- 孩子的数量怎么样?
- 所有的孩子都一样吗?
- 它的父节点是否相同?
- 相对于兄弟节点的位置怎么样?
醇>考虑添加两个节点 同一份文件。他们永远不会拥有 相对于兄弟姐妹的位置相同 节点,因此a中有两个节点 文件不能“平等”。
你可以然而比较两个 不同的文件。但你需要 自己回答这7个问题 你正在走两棵树。您的 对同一性的要求可能不同 来自其他人。
这是你最好的选择:走树并进行比较。