Я пытался заставить XInclude работать в моем XML-документе и, наконец, заставить его работать в Oxygen XML, который я использую для создания XML-документов.
Затем я пошел в свое приложение, написавв Java, но, похоже, он не поддерживает какую-либо форму разрешения XPointer, кроме использования чего-то вроде: element (/ 1/2).
Это, очевидно, ужасная схема, которую приходится использовать каждый раз, когдадокумент отредактирован, так как XPointer необходимо изменить, чтобы отразить новую позицию узла в XML!
Схема, с которой я работал, просто использовала xml: id в целевом документе:
<foo>
<bar xml:id="ABCD" />
</foo>
и затем, в другом документе:
<lorem>
<ipsum>
<xi:include href="target.xml" xpointer="ABCD" />
</ipsum>
</lorem>
То, что я ожидаю (и получаю в кислороде), приводит к чему-то вроде:
<lorem>
<ipsum>
<bar xml:id="ABCD" />
</ipsum>
</lorem>.
Однако в Java это терпит неудачу с:
Ошибка чтения файла в формате XML (href = 'data / target.xml').Причина: разрешение XPointer не удалось.
Если, однако, я изменю тег включения для использования
xpointer="element(/1/1)"
, тогда он будет работать очень хорошо - но, как я уже сказал, этоочень плохое решение.
Я просто использую реализации, включенные в среду выполнения Java (1.8).
Вот код, который я использую:
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
factory.setNamespaceAware(true);
factory.setXIncludeAware(true);
Source resultSource = new
StreamSource(Gdx.files.internal("data/result.xsd").read());
Source targetSource = new
StreamSource(Gdx.files.internal("data/target.xsd").read());
Source[] schemaFiles = {targetSource, resultSource};
schema =
SchemaFactory.newInstance("http://www.w3.org/2001/XMLSchema")
.newSchema(schemaFiles);
factory.setSchema(schema);
builder = factory.newDocumentBuilder();
itemDoc = builder.parse(new
InputSource(Gdx.files.internal("data/result.xml").read()));