【问题标题】:How can I compare two similar XML files in XMLUnit如何在 XMLUnit 中比较两个相似的 XML 文件
【发布时间】:2010-12-16 02:36:12
【问题描述】:

我想使用XMLUnit 来比较两个相似的 XML 文件。

基本上每件事都是一样的,File1File2 的副本,但在 File2 我已经更改了一个节点中某些元素的顺序。

我正在尝试运行一个测试,它比较这些文件并返回 相似 的结果,而不是将这些文件视为 不同

【问题讨论】:

    标签: xmlunit


    【解决方案1】:

    我认为这个链接可以帮助你 - http://www.ibm.com/developerworks/java/library/j-cq121906.html#N10158

    基本上,如果你的 File1 像 -

    <account>
     <id>3A-00</id>
     <name>acme</name>
    </account>
    

    和File2一样,只是&lt;name&gt;&lt;id&gt;的顺序不同-

    <account>
     <name>acme</name>
     <id>3A-00</id>
    </account> 
    

    然后您可以编写如下所示的测试来比较这些并返回相似的结果。

    public void testIdenticalAndSimilar() throws Exception {
       String controlXML = "<account><id>3A-00</id><name>acme</name></account>";
       String testXML = "<account><name>acme</name><id>3A-00</id></account>"; 
       Diff diff = new Diff(controlXML, testXML);
       assertTrue(diff.similar());
       assertFalse(diff.identical());
    }
    

    希望对您有所帮助。

    【讨论】:

    • 当我使用字符串时,比较工作正常。但是当我使用该文件时,它不会。我为每个文件声明 InputSource 对象,然后创建一个包含两个 InputSource 对象的 Diff 对象。当我以这种方式使用类似的命令时,它会失败并说文件不同。这是一种有效的比较方式吗?
    • 您的 XML 文件有多大?你能把内容贴在这里吗?
    • 如果缺少任何标签,例如缺少来自 controlXML 的 id 标签,如何处理 String controlXML = "acme"; String testXML = "acme3A-00";如果有超过 3 个子节点,则比较显示有线结果
    【解决方案2】:

    应该这样做:

        // Assuming file1 and file2 are not deeply nested XML files
        DocumentBuilderFactory docBuilderFactory = DocumentBuilderFactory.newInstance();
        DocumentBuilder docBuilder = docBuilderFactory.newDocumentBuilder();
        Document doc1 = docBuilder.parse(file1);
        Document doc2 = docBuilder.parse(file2);
    
        // SOLUTION 1: Are the files "similar"?
        Diff diff = new Diff(doc1, doc2);
        System.out.println("Similar (true/false): " + diff.similar());
    
        // SOLUTION 2: Should you want detailed differences (especially useful for deeply nested files)
        Diff diff = new Diff(doc1, doc2);
        diff.overrideElementQualifier(new RecursiveElementNameAndTextQualifier()); 
        DetailedDiff detailedDiff = new DetailedDiff(diff); 
        System.out.println("Detailed differences: " + detailedDiff.getAllDifferences().toString());
    

    希望能有所帮助。阅读 XMLUnit here

    【讨论】:

      【解决方案3】:
      diff =
              DiffBuilder.compare(expected)
                .withTest(toBeVerified)
                .ignoreWhitespace()
                .checkForSimilar()
                .withNodeMatcher(new DefaultNodeMatcher(ElementSelectors.byNameAndText, ElementSelectors.byName))
                .build();
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-05-31
        • 1970-01-01
        • 1970-01-01
        • 2021-07-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多