0

I have a java application that contains of 2 parts: Core project(module) and App project(module). Core module is dependent by several apps. I configure the work of my App module in config.xml file. I want to put xml file with common settings to Core module's resources to let all apps use xinclude to include this part to their configs. I use SAXParser to parse config.xml. This is what my config.xml looks like:

<?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>

File common.xml is places in CoreModule/src/resources. How can I access this file from config.xml that is places in working directory on AppModule? Thank you.

4

1 に答える 1

0

あなたがするとき

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()メソッドのsystemIdパラメータとして「cp://common.xml」を取得できます。

<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 を取得します。

于 2015-03-05T10:31:15.557 に答える