代码之家  ›  专栏  ›  技术社区  ›  henrik

Java XMLUnit比较不同信息排序的XML文件

  •  0
  • henrik  · 技术社区  · 9 年前

    我正在尝试验证和检查两个XML文件之间的差异。

    XML文件1:

    <Customer .....>
        <Description description="Foo" name="Foo" language="svSE"/>
        <Description description="Bar" name="Bar" language="enUS"/>
    </Customer>
    

    XML文件2:

    <Customer .....>
        <Description description="Bar" name="Bar" language="enUS"/>
        <Description description="Foo" name="Foo" language="svSe"/>
    </Customer>
    

    如您所见,描述值在两个文件中的顺序不同。但它们仍然是可供导入的合法XML文件。

    在我的单元测试中尝试比较它们时,我得到以下断言错误:

    junit.framework.AssertionFailedError:org.custommonkey.xmlunit.Diff [不同]应为属性值“Foo”,但为“Bar”-正在比较 在 /message[1]/Customer[1]/Description[1]/@Description到 /消息[1]/客户[1]/描述[1]/@Description

    以下是XmlUnit java代码:

    public class FooTest extends AbstractTest {
    
        ...
    
        @Test
        public void assertFooBarFile() {
    
            ...
    
            XMLUnit.setIgnoreComments(Boolean.TRUE);
            XMLUnit.setIgnoreWhitespace(Boolean.TRUE);
            XMLUnit.setNormalizeWhitespace(Boolean.TRUE);
            XMLUnit.setIgnoreDiffBetweenTextAndCDATA(Boolean.TRUE);
            XMLUnit.setIgnoreAttributeOrder(Boolean.TRUE);
            XMLAssert.assertXMLEqual(doc1, doc2);
        }
    }
    

    我应该如何比较两个文件包含相同信息(而不考虑信息的生成顺序)?

    2 回复  |  直到 9 年前
        1
  •  1
  •   Pasupathi Rajamanickam    9 年前

    你可以试试这个。

    public static boolean compareXMLs(String xmlSource, String xmlCompareWith)
            throws Exception {
    XMLUnit.setIgnoreWhitespace(true);
    XMLUnit.setIgnoreComments(true);
    XMLUnit.setIgnoreAttributeOrder(true);
    
    XMLUnit.setNormalizeWhitespace(true);
    
    Diff myDiff = new Diff(xmlSource, xmlCompareWith);
    myDiff.similar()
    }
    

    测验

    String x1 = "<a><a1/><b1/></a>";
    String x2 = "<a><b1/><a1/></a>";
    assertTrue(compareXMLs(x1, x2));
    
        2
  •  1
  •   henrik    9 年前

    我通过添加以下内容来解决问题:

    Diff diff = new Diff(doc1, doc2);
    diff.overrideElementQualifier(new ElementNameAndAttributeQualifier());
    XMLAssert.assertXMLEqual(diff, Boolean.TRUE);