XMLUnit - Сравнение двух ответов XML

Ожидаемый ответ 1:

<?xml version="1.0" encoding="UTF-8"?>
<GetResponse xmlns="http://whatever.co.uk/xsd/nam/message/GetResponse/">
    <Success>
        <Case>
            <Mort>M123456</Mort>
            <Appl>01</Appl>
        </Case>
        <Decision>D</Decision>
        <ProcessingRoute>R</ProcessingRoute>
        <Score>99999</Score>
    </Success>
</GetResponse>

и actualResponseXml:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<GetResponse xmlns:ns2="http://whatever.co.uk/xsd/nam/message/GetResponse/"> 
    <ns2:Success> 
        <ns2:Case> 
            <ns2:Mort>M123456</ns2:Mort> 
            <ns2:Appl>01</ns2:Appl> 
        </ns2:Case> 
        <ns2:Decision>D</ns2:Decision> 
        <ns2:ProcessingRoute>R</ns2:ProcessingRoute> 
        <ns2:Score>99999</ns2:Score> 
    </ns2:Success> 
</GetResponse>

Сообщение об ошибке:

Expected child 'GetResponse' but was 'null' - comparing <GetResponse...> at /GetResponse[1] to <NULL>

Сравнительный код:

Diff myDiffSimilar = DiffBuilder.compare(Input.fromString(actualResponseXml))
                                        .withTest(Input.fromString(expectedResponseXml))
                                        .checkForSimilar()
                                        .withNodeMatcher(new DefaultNodeMatcher(ElementSelectors.byName))
                                        .build();

Я попробовал все из официальной учетной записи github для XMLUnit и нескольких похожих вопросов на stackru, чтобы исправить эту ошибку, которая, по моему мнению, является разницей в пространстве имен, которая должна была игнорироваться разницей в Engine. Начиная с приведенного выше кода, я сравниваю два xmls через их представление String. Когда я вынимаю checkForSimilar() Я получаю эту ошибку вместо

Expected namespace uri 'null' but was 'http://whatever.co.uk/xsd/nam/message/GetResponse/'

Моя maven зависимость

<dependency>
    <groupId>org.xmlunit</groupId>
    <artifactId>xmlunit-legacy</artifactId>
    <version>2.5.0</version>
    <scope>test</scope>
</dependency>

Любая помощь будет оценена по достоинству!

1 ответ

После борьбы с этой проблемой, о которой упомянутые выше парни назвали проблемой пространства имен, я обнаружил, в чем проблема. при маршалинге объекта jaxb в XML избегайте использования конструктора QName(localPart), так как это приводит к непредсказуемым проблемам, о которых известно и упоминается в документации!

В контексте XML все имена элементов и атрибутов существуют в контексте пространства имен. Это явное указание при создании QName помогает предотвратить сложные для диагностики ошибки достоверности XML. Предпочтительными являются конструкторы QName(String namespaceURI, String localPart) и QName(String namespaceURI, String localPart, String prefix). ссылка здесь


Почему это удивительно для меня! использование

marshaller.marshal(new JAXBElement(new QName(namespaceURI, localPart, NS_PREFIX), jaxbObject.getClass(), jaxbObject), outputStream);

на вашем маршаллере, чтобы удалить ненужные пространства имен и установить его по умолчанию.

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