JAVA中的XML文件比较忽略节点顺序

时间:2019-09-18 12:54:13

标签: java xml xmlunit

我想使用xml比较JAVA文件,并检查它们是否“等效”。 以下代码在2种情况下对我有用:

  1. 当xml文件完全相同时。
  2. 当xml文件具有差异时

但是在以下情况下失败:

  1. XML文件包含相同的节点,但是它们的顺序不同。

一个名为Sample.xml的文件,其内容为:

<Employee>
    <FirstName>Jack</FirstName>
    <LastName>Dave</LastName>
    <Age>21</Age>
    <Professtion>Doctor</Professtion>
</Employee>

另一个名为Sample1.xml的文件,其内容为:

<Employee>
    <Age>21</Age>
    <Professtion>Doctor</Professtion>
    <FirstName>Jack</FirstName>
    <LastName>Dave</LastName>
</Employee>

请注意内容相同,但顺序不同。

我尝试了[this 1],但对我而言无效。

我尝试的代码如下:

import java.io.BufferedReader;
import java.io.FileReader;
import java.util.List;

import org.custommonkey.xmlunit.DetailedDiff;
import org.custommonkey.xmlunit.Diff;
import org.custommonkey.xmlunit.XMLUnit;
import org.custommonkey.xmlunit.examples.RecursiveElementNameAndTextQualifier;

public class CompareXML {

    public static void main(String[] args) {

        try (BufferedReader bufferedReaderExistingFile = new BufferedReader(new FileReader("C:\\Test\\Sample.xml"));
                BufferedReader bufferedReaderNewFile = new BufferedReader(new FileReader("C:\\Test\\Sample1.xml"))) {

            XMLUnit.setIgnoreWhitespace(true);
            XMLUnit.setIgnoreAttributeOrder(true);
            XMLUnit.setIgnoreComments(true);

            Diff d = new Diff(bufferedReaderExistingFile, bufferedReaderNewFile); 
            d.overrideElementQualifier(new RecursiveElementNameAndTextQualifier());
            DetailedDiff detailedDiff = new DetailedDiff(d);
            List<?> allDifferences1 = detailedDiff.getAllDifferences();

            System.out.println("  difference are :: " + allDifferences1.isEmpty());
            System.out.println("  difference are :: " + allDifferences1.size());
            System.out.println("  difference are :: " + allDifferences1.toString());

        }catch(Exception e) {
            System.out.println(e.getMessage());
        }
    }

}

我也尝试了以下代码:

Diff diff = DiffBuilder.compare(bufferedReaderExistingFile)
    .withTest(bufferedReaderNewFile).ignoreComments()
    .ignoreWhitespace()
    .withNodeMatcher(new DefaultNodeMatcher(ElementSelectors.byName))
    .checkForSimilar()
    .build();

System.out.println("  difference are :: " + diff.hasDifferences());

2 个答案:

答案 0 :(得分:1)

您可以使用DifferenceEvaluators做到这一点:

DifferenceEvaluator evaluator = DifferenceEvaluators
  .downgradeDifferencesToEquals(ComparisonType.CHILD_NODELIST_SEQUENCE);



Diff diff = DiffBuilder.compare(bufferedReaderExistingFile)
    .withTest(bufferedReaderNewFile).ignoreComments()
    .ignoreWhitespace()
    .withNodeMatcher(new DefaultNodeMatcher(ElementSelectors.byName))
    .withDifferenceEvaluator(evaluator)
    .checkForSimilar()
    .build();


答案 1 :(得分:1)

您可以使用 Diff 中的 similar()方法,如documentation中所述:

  

返回比较结果。如果两个文档包含相同的元素和属性(无论顺序如何),则被视为“相似”。

您的代码可能是这样的:

Diff diff = XMLUnit.compareXML(bufferedReaderExistingFile, bufferedReaderNewFile);
System.out.println("Both documents are similar: " + diff.similar());

请注意,尽管顺序是XML matters,所以您呈现的两个XML示例本质上是不同的XML。