问题 如何在Ruby中测试XML相等性?


显然我需要(a)将两个字符串转换为 规范的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了,所以我更愿意坚持下去,但我会使用任何图书馆的作品。


9196
2017-09-15 23:09


起源

我想看到一个很好的答案。 AFAIK,规范XML是您目前唯一的选择。 - Swanand
可能重复 diff一个ruby字符串或数组 - sawa


答案:


如果你正在寻找结构相等而不关心标签和属性的顺序,可能是 XML的简单 图书馆是个不错的选择。它将xml转换为ruby的数据结构(散列和列表),可以安全地与之比较 == 运营商。


4
2018-05-17 12:42





实际上有几个很好的基于Nokogiri的库用于检查XML树的等价性,包括 等效XML 要么 引入nokogiri-DIFF,这可能会有所帮助。

我更喜欢等效的xml,因为它提供了更多的灵活性(可能以严格为代价?),允许您与元素顺序或空格进行比较或不考虑。


11
2018-05-17 15:10



此外,等效xml提供了RSpec匹配器。 - Franklin Yu


将它们转换为字符串将不会非常成功。例如,如果一个元素有两个属性,那么顺序真的重要吗?在大多数情况下,没有。给定节点的子节点顺序?取决于你在做什么。但如果其中一个问题的答案是“不”,那么简单的字符串比较就是充其量的问题。

Nokogiri没有任何东西能为你做这件事;你必须自己建造它。亚伦帕特森 这里讨论一些问题

就XML文档而言   有关,从来没有两个节点   等于。文档中的每个节点都是   不同。每个节点都有很多   要比较的属性:

  1. 这个名字是一样的吗?
  2. 属性怎么样?
  3. 命名空间怎么样?
  4. 孩子的数量怎么样?
  5. 所有的孩子都一样吗?
  6. 它的父节点是否相同?
  7. 它相对于兄弟节点的位置怎么样?

考虑添加两个节点   同一份文件。他们能 决不 有   相对于兄弟姐妹的相同立场   节点,因此a中有两个节点   文件不能“平等”。

能够 然而比较两个   不同的文件。但你需要   自己回答这7个问题   你走在两棵树上。你的   对同一性的要求可能不同   来自其他人。

这是你最好的选择:走树并进行比较。


1
2017-09-16 00:40



我很确定规范的XML(w3.org/TR/xml-c14n)处理所有这七个问题。 - James A. Rosen