【问题标题】:XInclude xml file from resources of dependent java moduleX从依赖的java模块的资源中包含xml文件
【发布时间】:2015-03-05 08:03:11
【问题描述】:

我有一个包含两部分的 java 应用程序:核心项目(模块)和应用程序项目(模块)。核心模块依赖于几个应用程序。我在 config.xml 文件中配置我的 App 模块的工作。我想将具有通用设置的 xml 文件放入核心模块的资源中,以让所有应用程序使用 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 访问此文件? 谢谢。

【问题讨论】:

  • 找到了答案。贴在下面。

标签: java xml saxparser xinclude


【解决方案1】:

当你这样做时

SAXParserFactory factory = SAXParserFactory.newInstance();
factory.setXIncludeAware(true);
factory.setNamespaceAware( true );
SAXParser parser = factory.newSAXParser();
parser.parse(input, new MyHandler());

在您的 MyHandler 类中覆盖 resolveEntity(publicId, systemId) 方法。 在配置中将“common.xml”更改为“cp://common.xml”。它会让您在 resolveEntity() 方法中获得“cp://common.xml”作为 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。

【讨论】:

    猜你喜欢
    • 2019-06-04
    • 2020-09-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-26
    • 2021-07-09
    相关资源
    最近更新 更多