xi:include的文件不存在,因为解析器正在从项目根目录中查找

时间:2013-08-11 08:39:41

标签: java xml

我目前有一个包含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加载包含作为资源?

1 个答案:

答案 0 :(得分: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;
    }
});

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