Объедините несколько файлов XML с тегами xinclude в один файл
Я создаю установщик в IzPack. Он довольно большой, и я правильно разбил свои XML-файлы, используя теги
Я собирался начать писать инструмент на Java для загрузки XML-файлов и их объединения, но я не хочу изобретать велосипед.
Предоставляют ли библиотеки Java XML встроенную обработку xinclude? Гугл, похоже, не очень полезен.
Ничего страшного, если мне придется написать это самому, просто хотел уточнить у вас, ребята. Благодарю.
Формат 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, но, надеюсь, у кого-то есть простой ответ.
Тим Рейнольдс
5 ответов
Если вы не можете заставить работать xinclude и используете Ant, я бы порекомендовал XMLTask, который является плагином для Ant. Он сделает много умных вещей, включая одну вещь, которая вас интересует - создание XML-файла из фрагментов.
например
<xmltask source="templatefile.xml" dest="finalfile.xml">
<insert path="/packs/pack[1]" position="under" file="pack1.xml"/>
</xmltask>
(предупреждение - выше сделано из памяти, поэтому, пожалуйста, обратитесь к документации!).
Обратите внимание, что в приведенном выше файле pack1.xm l не обязательно должен иметь корневой узел.
Я не уверен, поддерживает ли java автоматический xinclude. Но вам придется использовать пространства имен, чтобы заставить его работать. Так что не используйте <xinclude ....>
, но используйте:
<xi:xinclude xmlns:xi="http://www.w3.org/2001/XInclude" href="example/File2.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" >
<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.
Например, 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);
Их документация также говорит, что вы можете включить его как функцию