XMLUnit - Добавлены теги?

При сравнении следующих двух документов с XMLUnit (последняя версия - 2.3.0) В этом документе порядок элементов не имеет значения, однако XMLUnit учитывает это, и поскольку новый элемент добавляется в начало родительского тега, это обнаруживает многократные изменения, когда только одно произошло.

Оригинальный XML (предыдущий):

<ACVS>
    <ACV>
        <N>735</N>
        <C>S135</C>
    </ACV>
    <ACV>
        <N>736</N>
        <C>C0S135</C>
    </ACV>
    <ACV>
        <N>7Q4</N>
        <C>C0S135</C>
    </ACV>
</ACVS>

Новый XML (текущий):

<ACVS>
    <ACV>
        <N>701</N>
        <C>C10S120</C>
    </ACV>
    <ACV>
        <N>735</N>
        <C>S135</C>
    </ACV>
    <ACV>
        <N>736</N>
        <C>C0S135</C>
    </ACV>
    <ACV>
        <N>7Q4</N>
        <C>C0S135</C>
    </ACV>
</ACVS>

Сравнение:

Diff fileChanges = DiffBuilder.compare(Input.fromFile(previous))
            .withTest(Input.fromFile(current))
            .ignoreWhitespace()
            .checkForSimilar()
            .build();

fileChanges.getDifferences()

Я заканчиваю с рядом изменений, поскольку элементы сопоставляются неправильно:

  • ACV [1] - N [1]: ожидаемый "735", но был "701"
  • ACV[1] - C[1]: ожидаемый "S135", но был "C10S120"
  • ACV[2] - N[1]: ожидаемый "736", но был "735"
  • и т.д... тогда:
  • ACV [4]: ​​добавлен новый тег

Когда я надеюсь на одно изменение:

  • ACV [1]: добавлен новый тег

Есть ли способ, которым я могу достичь этого результата с помощью XMLUnit?

1 ответ

Решение

Вы хотите помочь XMLUnit понять, какие ACVs принадлежат друг другу, указав ElementSelector который идентифицирует пары. Но даже тогда вы получите два Differences, кроме "добавлен новый тег", будет "количество детей ACVS это отличается.

Глядя на ваши примеры, вы, кажется, думаете о своем ACVкак это определено в текстовом содержании N ребенок. Это то, что вам нужно сказать XMLUnit. Ситуация очень похожа на tr пример в https://github.com/xmlunit/user-guide/wiki/SelectingNodes (заменить tr с ACV а также th с N). Вы должны быть в состоянии получить ожидаемый результат через

ElementSelectors.conditionalBuilder()
    .whenElementIsNamed("ACV").thenUse(ElementSelectors.byXPath("./N", ElementSelectors.byNameAndText))
    .elseUse(ElementSelectors.byName)
    .build();

или вариация этого.

Другие вопросы по тегам