Создаю установщик в IzPack. Он довольно большой, и я соответствующим образом разбил свои XML-файлы, используя теги <xinclude> и <xfragment>. К сожалению, IzPack не объединяет их вместе при создании установщика. Это требует, чтобы вы упаковали файлы с помощью установщика, который просто не будет работать.
Я собирался начать писать инструмент на Java для загрузки файлов XML и их объединения, но я не хочу изобретать колесо.
Предоставляют ли библиотеки Java XML встроенную обработку xinclude? Google не появлялся особо.
Ничего страшного, если мне придется писать это самому, просто хотел уточнить у вас, ребята. Спасибо.
Формат XML для примера целей: File1.xml
<?xml version = "1.0" encoding = "iso-8859-1" standalone = "yes" ?>
<installation version = "1.0">
<packs>
<pack name = "Transaction Service" id = "Transaction Service" required = "no" >
<xinclude href = "example/File2.xml" />
</pack>
</packs>
File2.xml
<xfragment>
<file src = "..." />
</xfragment>
File2 не требует стандартного заголовка XML. XML-файл анализируется во время сборки, поскольку указанные в нем ресурсы включены в установщик. Что не включено, так это фактическая информация XML (порядок записи файлов, место их размещения и т. д.)
Что я хочу произвести:
<?xml version = "1.0" encoding = "iso-8859-1" standalone = "yes" ?>
<installation version = "1.0">
<packs>
<pack name = "Transaction Service" id = "Transaction Service" required = "no" >
<file src = "..." />
</pack>
</packs>
Спасибо, сейчас я собираюсь начать собирать все вместе на Java, но, надеюсь, у кого-то есть простой ответ.
Тим Рейнольдс




Я не уверен, поддерживает ли Java автоматический xinclude. Но вам придется использовать пространства имен, чтобы это работало. Поэтому не используйте <xinclude ....>, а используйте:
<xi:xinclude xmlns:xi = "http://www.w3.org/2001/XInclude" href = "example/File2.xml" />
Обычно включенный файл также должен содержать заголовок xml. Нет необходимости, например, иметь такую же кодировку.
К сожалению, IzPack не поддерживает пространства имен. izpack.org/documentation/… Но, зная, что я не могу ожидать, что это будет обрабатываться автоматически с помощью Java, полезно знать. Я просматриваю исходники IzPack прямо сейчас. Они используют NanoXML ...
Если вы не можете заставить работать xinclude и используете Ant, я бы порекомендовал XMLTask, который является задачей плагина для Ant. Он будет делать много умных вещей, включая то, что вас интересует - создание XML-файла из фрагментов.
например
<xmltask source = "templatefile.xml" dest = "finalfile.xml">
<insert path = "/packs/pack[1]" position = "under" file = "pack1.xml"/>
</xmltask>
(предупреждение - все вышеизложенное сделано по памяти, обратитесь к документации!).
Обратите внимание, что в приведенном выше файле pack1.xml не обязательно должен быть корневой узел.
Например, Apache Xerces должен поддерживать Xinclude, но вам нужно будет включить его.
http://xerces.apache.org/xerces2-j/faq-xinclude.html
import javax.xml.parsers.SAXParserFactory;
SAXParserFactory spf = SAXParserFactory.newInstance();
spf.setNamespaceAware(true);
spf.setXIncludeAware(true);
В их документации также говорится, что вы можете включить его как особенность
Теперь это работает:
<?xml version = "1.0" encoding = "iso-8859-1" standalone = "yes" ?>
<installation version = "1.0">
<packs>
<pack name = "Transaction Service" id = "Transaction Service" required = "no" >
<xi:include href = "example/File2.xml" xmlns:xi = "http://www.w3.org/2001/XInclude" />
</pack>
</packs>
пример / File2.xml
<?xml version = "1.0" encoding = "iso-8859-1" standalone = "yes" ?>
<xfragment>
<file src = "..." />
</xfragment>
Просто для всех, кто хочет знать. IzPack использовал nanoXML для анализа всех файлов конфигурации. У него нет пространств имен. И не обрабатывает xml, включает.
Чтобы решить возникшую у меня проблему, я добавил элемент «xinclude» и т. д. (Фрагмент / резерв) в материал парсера, чтобы он в основном соответствовал стандартам для x: include (обратите внимание на разницу в именах?) Один правильный и имеет пространство имен. Другой - неприятный прием, который претендует на то, чтобы следовать стандарту без использования пространств имен.
В любом случае, это было давно, и теперь IzPack использует нормальный синтаксический анализатор XML и понимает, правильно ли вы делаете это xi: include или любой другой префикс, который вы хотите использовать, нет проблем. Это стандартно для приличных парсеров xml.
Я экспериментирую с xom.nu для выполнения XIncludes. Вы когда-нибудь заставляли его работать?