我有一个包含2个部分的java应用程序:核心项目(模块)和应用程序项目(模块)。核心模块依赖于多个应用程序。我在 config.xml 文件中配置了我的App模块的工作。我想将具有常用设置的xml文件放到Core模块的资源中,让所有应用程序使用xinclude将此部分包含在其配置中。我使用SAXParser来解析 config.xml 。 这就是我的 config.xml 的样子:
<?xml version="1.0" encoding="UTF-8" ?>
<myapp>
<xi:include href="common.xml" xmlns:xi="http://www.w3.org/2001/XInclude"/>
<app-specific-data>
...
</app-specific-data>
</myapp>
文件 common.xml 是CoreModule / src / resources中的位置。 如何从AppModule上工作目录中的 config.xml 访问此文件? 谢谢。
答案 0 :(得分:0)
当你这样做时
SAXParserFactory factory = SAXParserFactory.newInstance();
factory.setXIncludeAware(true);
factory.setNamespaceAware( true );
SAXParser parser = factory.newSAXParser();
parser.parse(input, new MyHandler());
您的MyHandler类中的覆盖 resolveEntity(publicId,systemId)方法。 在配置更改&#34; common.xml&#34; to&#34; cp://common.xml"。它会让你得到&#34; cp://common.xml"作为 resolveEntity()方法中的 systemId 参数。
<xi:include href="cp://common.xml" xmlns:xi="http://www.w3.org/2001/XInclude"/>
在 resolveEntity()方法中执行下一步:
if( systemId.startsWith( "cp://" ) ){
InputStream is = this.getClass().getClassLoader().getResourceAsStream( systemId.substring( 5 ) );
InputSource isource = new InputSource( is );
isource.setPublicId( publicId );
isource.setSystemId( systemId );
return isource;
} else {
return super.resolveEntity( publicId, systemId );
}
如果省略
isource.setPublicId( publicId );
isource.setSystemId( systemId );
您将在 XIncludeHandler 中的 searchforrecursiveincludes()中获取NPE。