Ошибка синтаксического анализа XML с помощью xinclude и xpointer
Я использую Jdom 2.0.5 и открываю документ one.xml, в который входит другой файл two.xml через xinclude. Я звоню строителю следующим образом:
SAXBuilder builder = new SAXBuilder();
builder.setJDOMFactory(new LocatedJDOMFactory());
builder.setFeature("http://apache.org/xml/features/xinclude", true);
Document doc = builder.build(new File("c:\\temp\\one.xml"));
XMLOutputter out = new XMLOutputter(Format.getPrettyFormat());
System.out.println("salida es "+out.outputString(doc));
файл one.xml выглядит следующим образом:
<?xml version="1.0" encoding="UTF-8" ?>
<eco xmlns:xi="http://www.w3.org/2001/XInclude">
<tmp-path>/opt/eco/ecoprd/tmp</tmp-path>
<!--
<xi:include href="two.xml" parse="xml"/>
-->
<xi:include href="two.xml" parse="xml" xpointer="web-servers"/>
</eco>
и two.xml выглядит следующим образом:
<?xml version="1.0" encoding="UTF-8" ?>
<eco>
<web-servers xml:id="web-servers">
<valuations>
<url-base>http://naboo:8080</url-base>
<context>/Statements</context>
<path>/services/ValuationsXMLGenerator</path>
</valuations>
</web-servers>
</eco>
включение файла без xpointer работает нормально. Но если я использую xpointer, я получаю ошибку следующим образом:
org.jdom2.input.JDOMParseException: Error on line 7 of document file:/c:/temp/one.xml: An 'include' failed, and no 'fallback' element was found.
at org.jdom2.input.sax.SAXBuilderEngine.build(SAXBuilderEngine.java:228)
at org.jdom2.input.sax.SAXBuilderEngine.build(SAXBuilderEngine.java:277)
at org.jdom2.input.sax.SAXBuilderEngine.build(SAXBuilderEngine.java:264)
at org.jdom2.input.SAXBuilder.build(SAXBuilder.java:1116)
at test.XMLTest.main(XMLTest.java:17)
Caused by: org.xml.sax.SAXParseException; systemId: file:/c:/temp/one.xml; lineNumber: 7; columnNumber: 65; An 'include' failed, and no 'fallback' element was found.
at org.apache.xerces.util.ErrorHandlerWrapper.createSAXParseException(Unknown Source)
at org.apache.xerces.util.ErrorHandlerWrapper.fatalError(Unknown Source)
at org.apache.xerces.impl.XMLErrorReporter.reportError(Unknown Source)
at org.apache.xerces.impl.XMLErrorReporter.reportError(Unknown Source)
at org.apache.xerces.xinclude.XIncludeHandler.reportError(Unknown Source)
at org.apache.xerces.xinclude.XIncludeHandler.reportFatalError(Unknown Source)
at org.apache.xerces.xinclude.XIncludeHandler.reportFatalError(Unknown Source)
at org.apache.xerces.xinclude.XIncludeHandler.reportFatalError(Unknown Source)
at org.apache.xerces.xinclude.XIncludeHandler.emptyElement(Unknown Source)
at org.apache.xerces.impl.XMLNSDocumentScannerImpl.scanStartElement(Unknown Source)
at org.apache.xerces.impl.XMLDocumentFragmentScannerImpl$FragmentContentDispatcher.dispatch(Unknown Source)
at org.apache.xerces.impl.XMLDocumentFragmentScannerImpl.scanDocument(Unknown Source)
at org.apache.xerces.parsers.XML11Configuration.parse(Unknown Source)
at org.apache.xerces.parsers.XML11Configuration.parse(Unknown Source)
at org.apache.xerces.parsers.XMLParser.parse(Unknown Source)
at org.apache.xerces.parsers.AbstractSAXParser.parse(Unknown Source)
at org.apache.xerces.jaxp.SAXParserImpl$JAXPSAXParser.parse(Unknown Source)
at org.jdom2.input.sax.SAXBuilderEngine.build(SAXBuilderEngine.java:217)
... 4 more
Что мне не хватает? предположительно, xpointer="web-серверы" должны получить элемент web-serve с xml:id="web-серверы", но это не так. Какие-либо предложения?
2 ответа
Решение
Xerces поддерживает только элемент xpointer () Scheme
- https://xerces.apache.org/xerces2-j/javadocs/xerces2/org/apache/xerces/xpointer/XPointerHandler.html
- http://www.w3.org/TR/2003/REC-xptr-element-20030325/
так что, может быть
<xi:include href="two.xml" parse="xml" xpointer="element(web-servers)"/>
или же
<xi:include href="two.xml" parse="xml" xpointer="element(/1/1)"/>
где первый /1 - элемент "эко", а второй /1 - элемент "веб-серверы"
Если вы хотите использовать xpointer, попробуйте использовать это: http://etourdot.github.io/xincproc/