Сравнение похожих файлов xml с XmlUnit с неупорядоченными тегами (одно и то же имя тега с разными атрибутами) - PullRequest
6 голосов
/ 05 июля 2011

Я успешно пробую 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 ]

6 голосов
/ 27 июня 2012

Я нашел решение сам.

Diff diff = new Diff(controlXml, responseXml);
diff.overrideElementQualifier(new ElementNameAndAttributeQualifier());
3 голосов
/ 09 февраля 2016

Это похоже на работу с XMLUnit 2.0:

    Diff myDiff = DiffBuilder.compare(Input.fromString(expected))
            .withTest(Input.fromString(actual))
            .withNodeMatcher(new DefaultNodeMatcher(ElementSelectors.byNameAndAllAttributes))
            .checkForSimilar()
            .build();
1 голос
/ 24 декабря 2015

Вышеупомянутое решение работает только с порядком атрибутов, но оно не будет работать, если у вас есть проблемы с тем же порядком типов элементов, как показано ниже:

    <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.

...