【问题标题】:How to compare two xml with the same namespace but different prefixes using java and xmlunit如何使用 java 和 xmlunit 比较两个具有相同命名空间但前缀不同的 xml
【发布时间】:2012-11-01 17:42:43
【问题描述】:

我有 2 个 xml 文件:

问题在于属性前缀。

<element xmlns:prefix1="namespace" prefix1:attribute="some value">Some text</element>


<element xmlns:prefix2="namespace" prefix2:attribute="some value">Some text</element>

这两个 xml 是相同的,具有相同的命名空间,但具有不同的前缀。如果我与 xmlunit 进行比较-> 断言失败。我该如何处理?

如果相似()或相同()比较我有错误:

预期的属性名称为“消息:消息名称字符串”,但为“空”
预期的属性名称为“消息:消息版本”,但为“空”
预期的属性名称为“null”,但为“mes:MessageNameString”
预期的属性名称为“null”,但为“mes:MessageVersion”

【问题讨论】:

  • 您能否提供您正在测试的实际 XML?即使我添加属性,“相似”检查也会为我通过。
  • 我可以通过电子邮件发送。它们对于 stackoverflow 的表单来说相当庞大
  • XML 定义了“相同性”——应该可以基于相似的 XML 定义定义一个“相似”。例如&lt;a xmlns="foo"/&gt;&lt;foo:a xmlns:foo="foo"/&gt; 在语义上是同一个文档。如果子顺序很重要(通常很重要),使用“similar()”是有问题的。嘘!

标签: java xml namespaces xmlunit


【解决方案1】:

以下测试通过“相似”检查但未通过“相同”检查:

    String control = "<prefix1:element xmlns:prefix1=\"namespace\" prefix1:attribute=\"x\">Some text</prefix1:element>";
    String test = "<prefix2:element xmlns:prefix2=\"namespace\" prefix2:attribute=\"x\">Some text</prefix2:element>";
    try
    {
        Diff diff = XMLUnit.compareXML( control, test );
        assertTrue( "Similar", diff.similar() );
        assertTrue( "Identical", diff.identical() );
    }
    catch ( Exception e )
    {
        fail( e.getMessage() );
    }

来自 xmlunit API 文档:

  • 完全相同:文档中节点的内容和顺序完全相同
  • 相似:文档中节点的内容相同,但存在细微差别,例如兄弟元素的排序、命名空间前缀的值、隐含属性值的使用

所以使用“相似”检查应该会给你想要的。

编辑:添加前缀属性,结果相同。

【讨论】:

  • 问题出在属性前缀上。我纠正了我的例子。它适用于节点。
【解决方案2】:
// identical
XMLAssert.assertXMLEqual(XMLUnit.compareXML(control, test), true)
// similar
XMLAssert.assertXMLEqual(XMLUnit.compareXML(control, test), false)

【讨论】:

  • // similar 示例是错误的。当 XML 不同不相似时返回 true。
【解决方案3】:

使用 XMLUnit 1.x:

// Similar
XMLAssert.assertXMLEqual()

// Identical
XMLAssert.assertXMLIdentical()

使用 XMLUnit 2.x:

import static org.xmlunit.assertj.XmlAssert.assertThat;
...

// Similar
assertThat(xmlResult).and(xmlExpected).areSimilar();

// Identical
assertThat(xmlResult).and(xmlExpected).areIdentical();

https://github.com/xmlunit/xmlunit#comparing-two-documents

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-07-13
    • 1970-01-01
    • 1970-01-01
    • 2011-08-16
    • 1970-01-01
    • 2014-01-12
    • 2011-04-10
    相关资源
    最近更新 更多