我目前有一个包含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
加载包含作为资源?
答案 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
以获得正确的路径。