Объедините несколько файлов XML с тегами xinclude в один файл

Создаю установщик в 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, но, надеюсь, у кого-то есть простой ответ.

Тим Рейнольдс

Я экспериментирую с xom.nu для выполнения XIncludes. Вы когда-нибудь заставляли его работать?

jon077 28.05.2009 05:42
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
2
1
4 780
5

Ответы 5

Я не уверен, поддерживает ли 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 ...

razialx 16.09.2008 19:31

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

Другие вопросы по теме