簡體   English   中英

X從依賴java模塊的資源中包含xml文件

[英]XInclude xml file from resources of dependent java module

我有一個包含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訪問此文件? 謝謝。

當你這樣做

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

在您的MyHandler類中重寫resolveEntity(publicId,systemId)方法。 在config中將“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。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM