【问题标题】:How do I test XML equality in Ruby?如何在 Ruby 中测试 XML 相等性?
【发布时间】:2010-11-28 15:25:28
【问题描述】:

显然我需要 (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,所以我更愿意继续使用它,但我会使用任何可用的库。

【问题讨论】:

标签: xml ruby testing


【解决方案1】:

实际上有几个很好的基于 Nokogiri 的库来检查 XML 树的等价性,包括 equivalent-xmlnokogiri-diff,这可能会有所帮助。

我更喜欢equivalent-xml,因为它提供了更多的灵活性(也许以严格为代价?),允许您在考虑或不考虑元素顺序或空白的情况下进行比较。

【讨论】:

  • 加上等价的xml提供RSpec匹配器。
【解决方案2】:

如果您正在寻找结构相等并且不关心标签和属性的顺序,那么xml-simple 库可能是一个不错的选择。它将 xml 转换为 ruby​​ 的数据结构(哈希和列表),可以安全地与 == 运算符进行比较。

【讨论】:

    【解决方案3】:

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

    Nokogiri 没有什么可以为你做的;你必须自己建造它。亚伦帕特森discusses some of the issues here:

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

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

    考虑将两个节点添加到 相同的文件。他们可以永远拥有 相对于兄弟的相同位置 节点,因此一个节点中有两个节点 文档不能“相等”。

    可以但是比较两个 不同的文件。但是你需要 自己回答这 7 个问题 你正在走两棵树。您的 相同的要求可能不同 来自其他人。

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

    【讨论】:

    猜你喜欢
    • 2012-10-20
    • 1970-01-01
    • 2011-02-01
    • 1970-01-01
    • 2021-09-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多