Объедините несколько файлов XML с тегами xinclude в один файл - PullRequest
2 голосов
/ 16 сентября 2008

Я создаю установщик в IzPack. Он довольно большой, и я правильно разбил свои XML-файлы, используя теги и . К сожалению, IzPack не объединяет их вместе при сборке установщика. Это требует, чтобы вы упаковали файлы с установщиком, который просто не будет работать.

Я собирался начать писать инструмент на 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>

Файл2 не нуждается в стандартном заголовке 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 ]

1 голос
/ 16 сентября 2008

Если вы не можете заставить работать 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 не обязательно должен иметь корневой узел.

0 голосов
/ 18 декабря 2014

Просто для тех, кто хочет знать. IzPack использовал nanoXML для разбора всех файлов конфигурации. У него нет пространств имен. И не обрабатывает XML включает.

Чтобы решить проблему, я добавил элемент «xinclude» и т. Д. (Фрагмент / отступление) к элементу парсера, чтобы он в основном соответствовал стандартам для x: include (обратите внимание на разницу имен?) пространство имен. Другой - противный взлом, который притворяется, что следует стандарту, не используя пространства имен.

В любом случае, это давно, и теперь IzPack использует здравый анализатор XML и понимает, правильно ли вы это делаете: xi: include или любой другой префикс, который вы хотите использовать, проблем не возникает. Это стандартно в приличных парсерах xml.

0 голосов
/ 19 августа 2009

Это работает сейчас:

<?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>
0 голосов
/ 10 февраля 2009

Например, 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);

В их документации также сказано, что вы можете включить его как функцию

0 голосов
/ 16 сентября 2008

Я не уверен, поддерживает ли java автоматический xinclude. Но вам придется использовать пространства имен, чтобы заставить его работать. Так что не используйте <xinclude ....>, но используйте:

<xi:xinclude xmlns:xi="http://www.w3.org/2001/XInclude" href="example/File2.xml" />

Обычно включаемый файл должен также содержать заголовок xml. Для этого не требуется, например, имеют одинаковую кодировку.

...