Добавить узлы в XML во время выполнения? - PullRequest
0 голосов
/ 27 сентября 2010

Я пишу приложение, которое должно обновлять части уже существующего XML-файла на основе набора файлов в каталоге. Пример этого XML-файла можно увидеть ниже:

http://izpack.org/documentation/sample-install-definition.html

В приведенной ниже области действия добавлен список файлов, в котором указывается, должны ли они быть "разбираемыми" (используется для подстановки параметров):

  <packs>
    <pack name="Main Application" required="yes" installGroups="New Application" >
          <file src="post-install-tasks.bat" targetdir="$INSTALL_PATH"/>
          <file src="build.xml" targetdir="$INSTALL_PATH"/>
          <parsable targetfile="$INSTALL_PATH/post-install-tasks.bat"/>
          <parsable targetfile="$INSTALL_PATH/build.xml"/>
    </pack>
  </packs>

Теперь количество файлов, которые должны быть добавлены в эту область, может меняться при каждом запуске приложения. Чтобы сделать это возможным, я рассмотрел следующий подход:

1) Прочитать весь xml в org.w3c.dom. *; Документируйте и добавляйте узлы на основе результатов чтения каталога.

2) Каким-то образом добавить содержимое из файла .properties в область. Таким образом, можно обновить список файлов без перекомпиляции кода.

3) ??

Есть какие-нибудь предложения по хорошему подходу к такого рода задачам?

Ответы [ 2 ]

1 голос
/ 27 сентября 2010

если есть вероятность, что ваша конфигурация XML может иметь значительный размер, тогда действительно не стоит продолжать подход на основе DOM [из-за связанного с ней объема памяти при загрузке большого документа XML]

Вы должны взглянуть на StaX . он имеет высоко оптимизированный подход для анализа и написания XML-документов.

1 голос
/ 27 сентября 2010

3) Перезаписать старый файл новой измененной версией. Парсеры DOM сохраняют комментарии в неизменном виде, но в результате могут возникнуть различия в форматировании. Для записи в файл выполните:

Source source = new DOMSource(doc);
File file = new File(filename);
Result result = new StreamResult(file); 
Transformer xformer = TransformerFactory.newInstance().newTransformer();
xformer.transform(source, result); 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...