Как реализовать .withAttributeFilter в XMLUnit2.0 DiffBuilder? - PullRequest
0 голосов
/ 06 января 2020

Я хочу, чтобы моя Java программа игнорировала несколько атрибутов при сравнении двух XML. Я не хочу использовать Node Filter, так как он будет игнорировать дочерние элементы из сравнения. Я пробовал разные реализации фильтра атрибутов, но ничего не получалось. Когда я использую Node filter, фильтрация работает. Проблема только в атрибуте фильтра. Может кто-нибудь указать, где идет ошибка?

Часть XML Тестового документа

<?xml version="1.0"?>
<!DOCTYPE cXML SYSTEM "http://xml.cxml.org/schemas/cXML/1.2.009/Fulfill.dtd">
<cXML payloadID="{hh896538025}" timestamp="2019-12-02">
<Header>
     <!lines of text>
</Header>
<Request>
        <ConfirmationRequest>
            <ConfirmationHeader operation="new" noticeDate="2019-12-20">
                <............>
            </ConfirmationHeader>
            <OrderReference orderID="jkd578zw6nr" orderDate="2019-12-20">
                <DocumentReference payloadID="l90p459s35" />
            </OrderReference>
        </ConfirmationRequest>
    </Request>
<cXML>

Сравниваемый XML также совпадает формат.

Вот мой код:

Diff diff =
            DiffBuilder.compare(testDocument)
           .withTest(ComparisonDocument)
           .checkForSimilar()
           .ignoreWhitespace()
           .withAttributeFilter(attr -> (attr.getName().equals("timestamp")) || (attr.getName().equals("noticeDate")) || attr.getName().equals("confirmID")                                                    || attr.getName().equals("orderID") || attr.getName().equals("orderDate"))
        // .withNodeFilter(node ->(node.getNodeName().equals("ConfirmationHeader") || node.getNodeName().equals("OrderReference")))
           .withNodeMatcher(new DefaultNodeMatcher(ElementSelectors.conditionalBuilder()            .whenElementIsNamed("ConfirmationItem").thenUse(ElementSelectors.byXPath("./Name", ElementSelectors.byNameAndText))                                                    .elseUse(ElementSelectors.byName).build())).build();
...