Сравните два XML-файла с дочерними узлами, которые не расположены последовательно, с помощью xmlunit 2.3.0.

Я хочу сравнить два XML-файла в SoapUI (Groovy), которые похожи, но дочерние узлы расположены не по порядку. Я использую модуль XML версии 2.3.0.

XML1:
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:wsa="http://schemas.xmlsoap.org/ws/2004/03/addressing" xmlns:wsu="http://schemas.xmlsoap.org/ws/2002/07/utility" xmlns:s11="http://schemas.xmlsoap.org/soap/envelope/">
<env:Header xmlns:env="http://schemas.xmlsoap.org/soap/envelope/">
</env:Header>
<soap:Body>
<Details>
<RateType RateTypeID="6">
    <RateType>AAAAA</RateType>
    <BaseType xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:nil="true"/>
    <UOM>percent</UOM>
</RateType>
<RateType RateTypeID="3">
    <RateType>BBB</RateType>
    <BaseType xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:nil="true"/>
    <UOM>percent</UOM>
</RateType>
<RateType RateTypeID="41">
    <RateType>CCC</RateType>
    <BaseType xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:nil="true"/>
    <UOM>percent</UOM>
</RateType>
<RateType RateTypeID="43">
    <RateType>DDD</RateType>
    <BaseType xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:nil="true"/>
    <UOM>percent</UOM>
</RateType>
</Details>
</soap:Body>
</soap:Envelope>

XML2:

<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:wsa="http://schemas.xmlsoap.org/ws/2004/03/addressing" xmlns:wsu="http://schemas.xmlsoap.org/ws/2002/07/utility" xmlns:s11="http://schemas.xmlsoap.org/soap/envelope/">
<env:Header xmlns:env="http://schemas.xmlsoap.org/soap/envelope/">
</env:Header>
<soap:Body>
<Details>
<RateType RateTypeID="41">
    <RateType>CCC</RateType>
    <BaseType xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:nil="true"/>
    <UOM>percent</UOM>
</RateType>
<RateType RateTypeID="43">
    <RateType>DDD</RateType>
    <BaseType xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:nil="true"/>
    <UOM>percent</UOM>
</RateType>
<RateType RateTypeID="6">
    <RateType>AAAAA</RateType>
    <BaseType xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:nil="true"/>
    <UOM>percent</UOM>
</RateType>
<RateType RateTypeID="3">
    <RateType>BBB</RateType>
    <BaseType xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:nil="true"/>
    <UOM>percent</UOM>
</RateType>
</Details>
</soap:Body>
</soap:Envelope>

В приведенном выше примере оба XML похожи по содержанию, но отличается только последовательность. Я хочу сравнить их обоих, чтобы узнать, равны ли они.

Когда я запустил приведенный ниже код:

Diff myDiffSimilar = DiffBuilder.compare(XML1))
            .withTest(XML2)
            .withNodeMatcher(new DefaultNodeMatcher(ElementSelectors.conditionalBuilder().whenElementIsNamed("Rate").thenUse(ElementSelectors.selectorForElementNamed("RateValue", ElementSelectors.byNameAndAllAttributes)).build()))
            .withNodeMatcher(new DefaultNodeMatcher(ElementSelectors.conditionalBuilder().whenElementIsNamed("RateType").thenUse(ElementSelectors.selectorForElementNamed("RateType", ElementSelectors.byNameAndAllAttributes)).build()))
            .checkForSimilar().build();

log.info myDiffSimilar.getDifferences().toString();

Это дает мне следующий вывод

[Expected child '{http://schemas.xmlsoap.org/soap/envelope/}Envelope' but was 'null' - comparing <soap:Envelope...> at /Envelope[1] to <NULL> (DIFFERENT), Expected child 'null' but was '{http://schemas.xmlsoap.org/soap/envelope/}Envelope' - comparing <NULL> to <soap:Envelope...> at /Envelope[1] (DIFFERENT)]

Может ли кто-нибудь посоветовать мне селектор элементов/условный конструктор, который следует использовать в этом сценарии?


person KRS    schedule 30.11.2016    source источник
comment
Добро пожаловать в Stack Overflow! Всем, кто хотел бы воспроизвести ваш вывод, безусловно, было бы полезно, если бы вы могли опубликовать свой XML в виде текста, а не в виде изображения.   -  person haindl    schedule 01.12.2016
comment
Возможный дубликат - stackoverflow.com/ вопросы/40743664/   -  person Rao    schedule 01.12.2016
comment
@Rao Не совсем... Уже пробовал... Вот результат... Ожидаемая длина дочернего списка узлов "17", а была "16" - сравнение................. ......... верно неверно   -  person KRS    schedule 02.12.2016
comment
Я мог успешно сравнить. Можно ли сделать скрин полной трассировки атаки.   -  person Rao    schedule 02.12.2016


Ответы (1)


Попробуйте использовать это:

Diff diff = DiffBuilder.compare(actual)
            .withTest(expected)
            .ignoreComments()
            .ignoreWhitespace()
            .checkForSimilar()
            .withNodeMatcher(new DefaultNodeMatcher(new ByNameAndTextRecSelector(), ElementSelectors.byName))
            .build();

assert diff.hasDifferences()==false
person Hamza Amami    schedule 01.12.2016