XMLUnit 2 DiffBuilder ignoreComments() вызывает исключение для Saxon HE

Следующий простой пример демонстрирует проблему:

import org.xmlunit.builder.DiffBuilder;
import org.xmlunit.builder.Input;
import org.xmlunit.diff.ComparisonControllers;
import org.xmlunit.diff.DefaultNodeMatcher;
import org.xmlunit.diff.Diff;
import org.xmlunit.diff.ElementSelectors;

public class AnyDiff {

    public static void main(String[] args) throws Exception {
        String controlstr = "<root>hello</root>";
        String teststr = "<root>hello</root>";
        Diff diff = DiffBuilder.compare(Input.fromString(controlstr))
                .withTest(Input.fromString(teststr))
                .withNodeMatcher(new DefaultNodeMatcher(ElementSelectors.byNameAndText))
                .checkForSimilar()
                .ignoreWhitespace() // this is working with newest Saxon 9.8.0-2 (not worked with 9.7.0-15
                .ignoreComments()  // this is not working even with newest Saxon 9.8.0-2
                .withComparisonController(ComparisonControllers.Default)
                .build();
        System.out.println(diff.hasDifferences());
    }
}

При выполнении приведенного выше примера генерируется следующее исключение:

run:
Warning at char 6 in template/@match on line 1 column 122 
  XTDE0160: An error occurred matching pattern {( element() | text() | comment() |
  processing-instruction() )[not(error("XPath 1.0 Compatibility Mode is not available in
  this configuration"))]}: XPath 1.0 Compatibility Mode is not available in this configuration
Warning at char 6 in template/@match on line 1 column 122 
  XTDE0160: An error occurred matching pattern {( element() | text() | comment() |
  processing-instruction() )[not(error("XPath 1.0 Compatibility Mode is not available in
  this configuration"))]}: XPath 1.0 Compatibility Mode is not available in this configuration
Error 
  org.w3c.dom.DOMException: HIERARCHY_REQUEST_ERR: An attempt was made to insert a node
  where it is not permitted. 
Exception in thread "main" org.xmlunit.XMLUnitException: org.w3c.dom.DOMException: HIERARCHY_REQUEST_ERR: An attempt was made to insert a node where it is not permitted. 
        at org.xmlunit.transform.Transformation.transformTo(Transformation.java:190)
        at org.xmlunit.transform.Transformation.transformToDocument(Transformation.java:220)
        at org.xmlunit.input.CommentLessSource.<init>(CommentLessSource.java:45)
        at org.xmlunit.builder.DiffBuilder.wrap(DiffBuilder.java:389)
        at org.xmlunit.builder.DiffBuilder.build(DiffBuilder.java:368)
        at hu.telekom.reflex.util.AnyDiff.main(AnyDiff.java:27)
Caused by: net.sf.saxon.trans.XPathException: org.w3c.dom.DOMException: HIERARCHY_REQUEST_ERR: An attempt was made to insert a node where it is not permitted. 
        at net.sf.saxon.dom.DOMWriter.characters(DOMWriter.java:222)
        at net.sf.saxon.event.ProxyReceiver.characters(ProxyReceiver.java:190)
        at net.sf.saxon.event.ComplexContentOutputter.characters(ComplexContentOutputter.java:277)
        at net.sf.saxon.trans.TextOnlyCopyRuleSet.process(TextOnlyCopyRuleSet.java:75)
        at net.sf.saxon.trans.Mode.applyTemplates(Mode.java:477)
        at net.sf.saxon.trans.TextOnlyCopyRuleSet.process(TextOnlyCopyRuleSet.java:66)
        at net.sf.saxon.trans.Mode.applyTemplates(Mode.java:477)
        at net.sf.saxon.trans.TextOnlyCopyRuleSet.process(TextOnlyCopyRuleSet.java:66)
        at net.sf.saxon.trans.Mode.applyTemplates(Mode.java:477)
        at net.sf.saxon.Controller.transformDocument(Controller.java:2389)
        at net.sf.saxon.Controller.transform(Controller.java:1953)
        at net.sf.saxon.s9api.XsltTransformer.transform(XsltTransformer.java:589)
        at net.sf.saxon.jaxp.TransformerImpl.transform(TransformerImpl.java:73)
        at org.xmlunit.transform.Transformation.transformTo(Transformation.java:186)
        ... 5 more
Caused by: org.w3c.dom.DOMException: HIERARCHY_REQUEST_ERR: An attempt was made to insert a node where it is not permitted. 
        at com.sun.org.apache.xerces.internal.dom.ParentNode.internalInsertBefore(ParentNode.java:361)
        at com.sun.org.apache.xerces.internal.dom.ParentNode.insertBefore(ParentNode.java:288)
        at com.sun.org.apache.xerces.internal.dom.CoreDocumentImpl.insertBefore(CoreDocumentImpl.java:447)
        at com.sun.org.apache.xerces.internal.dom.NodeImpl.appendChild(NodeImpl.java:237)
        at net.sf.saxon.dom.DOMWriter.characters(DOMWriter.java:219)
        ... 18 more

Мой проект работает в среде Java 8. Если я закомментирую

.ignoreComments()

строка кода работает как положено.

Не могли бы вы помочь, как я могу игнорировать комментарии в сравнении XML (конечно, с использованием Saxon в качестве поставщика XSLT)? Заранее спасибо.

1 ответ

Здесь явно немного истории недавних ошибок.

https://github.com/xmlunit/xmlunit/issues/92

что относится к

https://saxonica.plan.io/issues/3241

И, глядя на github, я вижу, что соответствующий код в xmlunit меняется каждый день.

Поэтому важно точно определить, какую версию всего вы используете.

Я не знаю, связаны ли вы каким-либо образом с проектом xmlunit. Как правило, если приложение, использующее Saxon, выходит из строя, лучше сначала подать отчет об ошибке в приложение, хотя бы потому, что они уже могут знать об этом; они также лучше размещены, чтобы предоставить репродукцию, которая демонстрирует ошибку в Saxon, если она там есть. Но если это вас ни к чему не приведет, поднимите его на saxonica.plan.io.

Stackru на самом деле не является идеальным средством для отслеживания ошибок, особенно тех, которые связаны с интеграцией нескольких продуктов, поэтому я бы посоветовал следить за ними по каналам поддержки.

Два дальнейших наблюдения:

(а) предупреждающие сообщения

XTDE0160: Произошла ошибка при сопоставлении шаблона {( element() | text() | comment() | processing-инструкция ())[not(ошибка ("Режим совместимости XPath 1.0 недоступен в этой конфигурации"))]}: XPath 1.0 Режим совместимости недоступен в этой конфигурации

вероятно значимы. В Saxon 9.8 внесено изменение, которое, боюсь, будет довольно неудобно для проектов с открытым исходным кодом, таких как xmlunit: продукт HE больше не поддерживает режим обратной совместимости с 1.0. Это может означать, что xmlunit не будет работать с Saxon-HE 9.8, если не внесены изменения.

(b) DOM HIERARCHY_REQUEST_ERR, вероятно, возникает из-за того, что таблица стилей пытается записать текстовый узел как дочерний узел узла документа, что разрешено в модели XDM, но не в DOM. Однако я подозреваю, что это вторичная ошибка, вызванная тем, что ожидаемые правила шаблона не сработали, как следствие ошибки, возникшей во время сопоставления с образцом. Когда в сопоставлении с образцом возникает ошибка, образец обрабатывается как несоответствующий, и Саксон продолжает с предупреждением.

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