0

我目前有一个包含 XML 的 xml 资源文件。

stream = Main.class.getResourceAsStream("resource/Resource.xml");

在 xml 文件中:

<?xml version="1.0" encoding="UTF-8"?>
<root xmlns="http://www.w3.org/1999/xhtml"
      xmlns:xi="http://www.w3.org/2001/XInclude">   
    <element />
    <xi:include href="resource/1.xml"/>
</semantics>

但是,解析后Resource.xml,我收到一个错误,即包含的文件不存在。

检查后,该路径似乎与我的项目的根目录连接,但我的问题是资源文件1.xml稍后将位于 jar 文件中。

是否也可以将DocumentBuilder加载包含作为资源?

4

1 回答 1

3

您需要EnitityResolver2在您的上设置一个自定义,DocumentBuilder以便您可以在处理InputSource时返回正确xi:include的。

final DocumentBuilder documentBuilder = builderFactory.newDocumentBuilder();
documentBuilder.setEntityResolver(new EntityResolver2() {
    @Override
    public InputSource getExternalSubset(String string, String string1) throws SAXException, IOException {
        return null;
    }

    @Override
    public InputSource resolveEntity(String string, String string1, String string2, String string3) throws SAXException, IOException {
        final String resourceName = string3;
        final InputSource is = new InputSource();
        is.setSystemId(resourceName);
        is.setByteStream(Thread.currentThread().getContextClassLoader().getResourceAsStream(resourceName));
        return is;
    }


    @Override
    public InputSource resolveEntity(String string, String string1) throws SAXException, IOException {
        return null;
    }
});

这现在将返回类加载器加载的资源的一个InputSourceInputStream您可能需要操纵String以获得正确的路径。

于 2013-08-11T09:22:21.027 回答