2015-03-05 3 views
0

У меня есть приложение Java, которое содержит 2 части: основной проект (модуль) и проект приложения (модуль). Основной модуль зависит от нескольких приложений. Я настраиваю работу своего модуля App в файле config.xml. Я хочу поместить файл xml с общими настройками в ресурсы модуля Core, чтобы все приложения могли использовать xinclude для включения этой части в свои конфиги. Я использую SAXParser для разбора config.xml. Это то, что мой config.xml выглядит следующим образом:XInclude xml-файл из ресурсов зависимого модуля java

<?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/ресурсы. Как получить доступ к этому файлу с config.xml, который является местом в рабочем каталоге AppModule? Спасибо.

+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) метод. В config изменить «common.xml» на «cp: //common.xml». Это позволит вам получить «cp: //common.xml» как systemId параметр в resolveEntity() метод.

<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); 

вы получите NPE в searchforrecursiveincludes() в XIncludeHandler.

Смежные вопросы