将类似的xml文件与XmlUnit与无序标记进行比较(具有不同属性的相同标记名称)

时间:2011-07-05 09:30:10

标签: java xml xmlunit

我正在尝试成功运行XmlUnit,对我的工作非常有帮助。现在,我有一点问题,我不知道如何解决。我有一个java类,它有一个Set,当它转换为XML时,里面的元素可以有任何顺序。

当我在XmlUnit中尝试这两个文件时,它可以工作(Diff说它们是相似的):

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Monitor>
    <AvailableMeasures>
        <MeasureDescriptorA name="netInput_mynetwork"></MeasureDescriptorA>
        <MeasureDescriptor name="netInput_myothernetwork"></MeasureDescriptor>
    </AvailableMeasures>
</Monitor>
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Monitor>
    <AvailableMeasures>
        <MeasureDescriptor name="netInput_myothernetwork"></MeasureDescriptor>
        <MeasureDescriptorA name="netInput_mynetwork"></MeasureDescriptorA>
    </AvailableMeasures>
</Monitor>

但是当标签具有相同的名称(具有不同的属性)时,它不起作用(它混合了属性,并期望另一个标签中的属性):

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Monitor>
    <AvailableMeasures>
        <MeasureDescriptor name="netInput_myothernetwork"></MeasureDescriptor>
        <MeasureDescriptor name="netInput_mynetwork"></MeasureDescriptor>
    </AvailableMeasures>
</Monitor>
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Monitor>
    <AvailableMeasures>
        <MeasureDescriptor name="netInput_mynetwork"></MeasureDescriptor>
        <MeasureDescriptor name="netInput_myothernetwork"></MeasureDescriptor>
    </AvailableMeasures>
</Monitor>

有解决方法吗?

3 个答案:

答案 0 :(得分:6)

我自己找到了解决方案。

Diff diff = new Diff(controlXml, responseXml);
diff.overrideElementQualifier(new ElementNameAndAttributeQualifier());

答案 1 :(得分:3)

这似乎适用于XMLUnit 2.0:

    Diff myDiff = DiffBuilder.compare(Input.fromString(expected))
            .withTest(Input.fromString(actual))
            .withNodeMatcher(new DefaultNodeMatcher(ElementSelectors.byNameAndAllAttributes))
            .checkForSimilar()
            .build();

答案 2 :(得分:0)

上述解决方案仅适用于属性顺序,但如果您遇到与下面相同的元素类型顺序的问题,它将无效:

    <CustomerDataSet>
        <CustomerData>
            <Key>ACCOUNT_TYPE</Key>
            <Value>GREEN</Value>
        </CustomerData>
        <CustomerData name = "bla">
            <Key>EMAIL_ADDRESS</Key>
            <Value>MVNO_Automation_8@test.fr</Value>
        </CustomerData>
        <CustomerData>
            <Key>DATE_OF_BRITH</Key>
            <Value>01-01-1976</Value>
        </CustomerData>
    </CustomerDataSet>

            <CustomerDataSet>
        <CustomerData name = "bla">
            <Key>EMAIL_ADDRESS</Key>
            <Value>MVNO_Automation_8@test.fr</Value>
        </CustomerData>
        <CustomerData>
            <Key>ACCOUNT_TYPE</Key>
            <Value>GREEN</Value>
        </CustomerData>
        <CustomerData>
            <Key>DATE_OF_BRITH</Key>
            <Value>01-01-1976</Value>
        </CustomerData>
    </CustomerDataSet>

但是,您可以使用RecursiveElementNameAndTextQualifier来解决此问题。