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. Однако я подозреваю, что это вторичная ошибка, вызванная тем, что ожидаемые правила шаблона не сработали, как следствие ошибки, возникшей во время сопоставления с образцом. Когда в сопоставлении с образцом возникает ошибка, образец обрабатывается как несоответствующий, и Саксон продолжает с предупреждением.