【问题标题】:Compare Xml in java unit text, ignoring an attribute in a node比较Java单元文本中的Xml,忽略节点中的属性
【发布时间】:2017-02-07 09:25:40
【问题描述】:

我必须比较 2 个 xml 字符串。

实际

<?xml version="1.0" encoding="utf-8"?>
    <entry xmlns="http://www.w3.org/2005/Atom"
        xmlns:m="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata"
        xmlns:d="http://schemas.microsoft.com/ado/2007/08/dataservices"
        xml:base="http://localhost:49531/ODataV2.svc/ODataV2.svc/">
        <content type="application/xml">
            <m:properties>
                <d:ID>2000</d:ID>
                <d:ReleaseDate>1992-01-01T00:00:00</d:ReleaseDate>
                <d:Rating>4</d:Rating>
                <d:Price>2.5</d:Price>
            </m:properties>
        </content>
    </entry>

预期

<?xml version="1.0" encoding="utf-8"?>
<entry xmlns="http://www.w3.org/2005/Atom"
    xmlns:m="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata"
    xmlns:d="http://schemas.microsoft.com/ado/2007/08/dataservices"
    xml:base="http://localhost:55615/ODataV2.svc/ODataV2.svc/">
    <content type="application/xml">
        <m:properties>
            <d:ID>2000</d:ID>
            <d:ReleaseDate>1992-01-01T00:00:00</d:ReleaseDate>
            <d:Rating>4</d:Rating>
            <d:Price>2.5</d:Price>
        </m:properties>
    </content>
</entry>

以下代码失败,因为属性 xml:base 中的端口号在根节点中不同。

XMLAssert.assertXMLEqual(Actual, Expected);

预期的属性值 'http://localhost:55615/ODataV2.svc/ODataV2.svc/' 但是是 'http://localhost:49531/ODataV2.svc/ODataV2.svc/'

单元测试中的端口号在运行时发生变化。 有没有办法忽略特定属性并比较xml。

【问题讨论】:

标签: java xml junit xmlunit


【解决方案1】:

找到解决方案。我使用 custommonkey 库进行 xml 比较。 而不是XMLAssert.assertXMLEqual(Actual, Expected);

我使用下面的代码来确定差异。

Diff diff=XMLUnit.compareXML(Expected,Actual);
    diff.overrideDifferenceListener(new DifferenceListener() {
       public void skippedComparison(Node arg0, Node arg1) {
       }

       public int differenceFound(Difference difference) {
        if (difference.getControlNodeDetail().getXpathLocation().contains("entry")) {
            return DifferenceListener.RETURN_IGNORE_DIFFERENCE_NODES_IDENTICAL;
        } else {
            return DifferenceListener.RETURN_ACCEPT_DIFFERENCE;
        }
        }
    });
XMLAssert.assertXMLIdentical(diff,true);

【讨论】:

    【解决方案2】:

    我知道这不是最酷或最奇特的解决方案,但是您可以在比较它们之前“解析”两个 XML,然后删除或更改该属性的值,使其在两者中都相似,因此当您稍后比较它们时,您可以确定那件事不会影响结果

    【讨论】:

    • 一般来说这是唯一的解决方案。忽略差异的方法是通过规范化两个值(通常使用 XSLT)来屏蔽它们,以排除您不关心差异的区域/节点。
    【解决方案3】:

    XMLUnit 2.x 有NodeFilters 和AttributeFilters 的概念,它们很简单Predicates。

    assertThat(Actual, isIdenticalTo(Expected)
        .withAttributeFilter(a -> !"base".equals(a.getName())))
    

    可能会起作用。

    【讨论】:

      【解决方案4】:
      猜你喜欢
      • 2020-01-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-03
      • 2016-12-15
      • 2021-05-31
      • 1970-01-01
      相关资源
      最近更新 更多