Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/363.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何比较2个XML文件以及如何使用XMLUnit获取新添加\删除的元素等信息_Java_Xml_Xml Parsing_Xmlunit - Fatal编程技术网

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

Java 如何比较2个XML文件以及如何使用XMLUnit获取新添加\删除的元素等信息,java,xml,xml-parsing,xmlunit,Java,Xml,Xml Parsing,Xmlunit,我有两个结构几乎相似的xml文件,在这些xml文件中如何获取以下信息 新添加的控件(或节点) 移除并删除控件(或节点) 控件(或节点)属性已修改 为了向您提供信息,我尝试了以下代码: File f1 = new File(inputXMLPath); File f2= new File(outputXMLPath); FileReader fr1 = null; FileReader fr2 = null; try { fr1 = new

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

  • 新添加的控件(或节点)
  • 移除并删除控件(或节点)
  • 控件(或节点)属性已修改
  • 为了向您提供信息,我尝试了以下代码:

        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
    和示例代码的注释]

    我想您应该对未找到的
    子节点
    差异做出反应,如果使用
    XMLUnit.setCompareUnmatched(false)
    ,XMLUnit 1.x将发出这些差异

    如果差异的控制节点为空,则添加该节点-如果测试节点为空,则删除该节点。任何其他区别都是对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
    ***********************
    
    ***********************
    应存在子节点“baz”,但为“null”-将at/foo[1]/baz[1]与at null进行比较
    节点被删除
    ***********************
    ***********************
    应存在子节点“null”,但为“xyzy”-将null处的值与/foo[1]/xyzy[1]处的值进行比较
    已添加节点
    ***********************
    
    检查他们的控件新添加/删除的信息不是第一个xml文件。它总是盲目地比较内容,而我编写的代码(或XMLUnit API)没有像新添加/删除的节点等那样进行出色的比较。请您帮助我完成这项工作。非常感谢您的建议@SuperBiasedMan:我已经发布了代码。。你能给我一个建议吗?谢谢你的回答。。你能用任何示例代码来说明吗。这样我才能更好地理解。有一件事我忘了明确提到,Ragu,那就是
    setCompareUnmatched
    方法,您需要它来帮助我们绕过XMLUnit1的默认行为。谢谢您的回答。粘贴代码后。我在比较过程中遇到了一些问题。添加\删除的节点信息似乎不正确。我已在下面的链接:[link]()中上载了2个xml文件(用于比较),您可以看到XMLUnit显示的结果(已添加\删除的节点)似乎不正确。Stefan:我是否需要做任何其他事情(如实现任何接口…)解决比较过程中的此类问题。