java - 如何比较 2 个 XML 文件以及如何使用 XMLUnit 获取新添加\删除元素等信息

标签 java xml xml-parsing xmlunit

我有 2 个结构几乎相似的 xml 文件,在这些 XML 文件中如何获取以下信息??

  1. 新添加的控件(或节点)
  2. 删除控件(或节点)
  3. 修改了控件(或节点)属性。

为了您的信息,我尝试了以下代码:

    File f1 = new File(inputXMLPath);
    File f2= new File(outputXMLPath);
    FileReader fr1 = null;
    FileReader fr2 = null;
    try {
        fr1 = new FileReader(f1);
        fr2 = new FileReader(f2);
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    }

    try {
        Diff diff = new Diff(fr1, fr2);
        System.out.println("Similar? " + diff.similar());
        System.out.println("Identical? " + diff.identical());

        DetailedDiff detDiff = new DetailedDiff(diff);

        detDiff.overrideDifferenceListener(new DifferenceListener() {
            @Override
            public int differenceFound(Difference diff) {
                if (diff.getId() == DifferenceConstants.CHILD_NODELIST_SEQUENCE_ID
                    || diff.getId() == DifferenceConstants.CHILD_NODELIST_LENGTH_ID) {
                    return RETURN_IGNORE_DIFFERENCE_NODES_IDENTICAL;
                }
                return RETURN_ACCEPT_DIFFERENCE;
            }
            @Override
            public void skippedComparison(Node arg0, Node arg1) { }

        });


        List differences = detDiff.getAllDifferences();
        for (Object object : differences) {
            Difference difference = (Difference)object;
            System.out.println("***********************");
            System.out.println(difference);
            System.out.println("***********************");
        }

    } catch (SAXException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }

最佳答案

[编辑:添加了关于setCompareUnmatched 和示例代码的注释]

我认为您想对 CHILD_NODE_NOT_FOUND Difference 使用react,如果您使用 XMLUnit.setCompareUnmatched(false),XMLUnit 1.x 将发出.

如果 Difference 的控制节点为 null,则添加该节点 - 如果测试节点为 null,则将其删除。任何其他区别是对 XMLUnit 认为存在于任一侧的节点的更改。

例如

    FileReader fr1 = new FileReader(f1);
    FileReader fr2 = new FileReader(f2);
    XMLUnit.setCompareUnmatched(false);
    Diff diff = new Diff(fr1, fr2);
    System.out.println("Similar? " + diff.similar());
    System.out.println("Identical? " + diff.identical());

    DetailedDiff detDiff = new DetailedDiff(diff);

    detDiff.overrideDifferenceListener(new DifferenceListener() {
        @Override
        public int differenceFound(Difference diff) {
            if (diff.getId() == DifferenceConstants.CHILD_NODELIST_SEQUENCE_ID
                || diff.getId() == DifferenceConstants.CHILD_NODELIST_LENGTH_ID) {
                return RETURN_IGNORE_DIFFERENCE_NODES_IDENTICAL;
            }
            return RETURN_ACCEPT_DIFFERENCE;
        }
        @Override
        public void skippedComparison(Node arg0, Node arg1) { }

    });


    List differences = detDiff.getAllDifferences();
    for (Object object : differences) {
        Difference difference = (Difference)object;
        System.out.println("***********************");
        if (difference.getId() == DifferenceConstants.CHILD_NODE_NOT_FOUND_ID) {
            if (difference.getControlNodeDetail().getNode() == null) {
                System.out.println("Node was added");
            } else {
                System.out.println("Node was removed");
            }
        }
        System.out.println("***********************");
    }

会导致类似的事情

***********************
Expected presence of child node 'baz' but was 'null' - comparing <baz...> at /foo[1]/baz[1] to  at null
Node was removed
***********************
***********************
Expected presence of child node 'null' but was 'xyzzy' - comparing  at null to <xyzzy...> at /foo[1]/xyzzy[1]
Node was added
***********************

关于java - 如何比较 2 个 XML 文件以及如何使用 XMLUnit 获取新添加\删除元素等信息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31876797/

相关文章:

java - 添加到 StringToNominal 的选项没有效果

javascript - 在 IE 10 中转换 XML AJAX 响应时出错

xml - 用多个带前缀的 namespace 构造XML信封

java - 我可以说 "if class A is subclass of class B, type A must be subtype of type B"吗?

java - 字符编码问题 - Java

jquery - 使用Jquery解析xml时如何保留html

java - 如何解析 XML 标签外的文本?

android - 编写和读取 XML 的最简单方法

java - @Service 和 @Scope ("prototype") 一起

Java : file exists Vs searching large xml db