【发布时间】:2018-05-11 14:16:50
【问题描述】:
我一直在尝试让 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()));
【问题讨论】:
标签: java xml jaxp xinclude xpointer