Сохранение XML-файлов с внешними сущностями с помощью libxml без слияния в один

Мое приложение загружает конфигурацию из XML и работает с несколькими файлами, считанными как сущности, но когда я сохраняю документ обратно, он объединяет все файлы в один. Это не самое худшее, но было бы лучше, если бы изменения закончились в отдельных сущностях. Я готов использовать синтаксис XSD вместо DTD, если это опция, чего я хотел бы избежать, если это возможно, хотя необходимость загружать каждый файл как отдельные документы и объединять их вручную.

Пример конфигурации:

<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE cfg SYSTEM "cfg.dtd" [
  <!ENTITY sec SYSTEM "sec.xml">
]>
<cfg>
  <!-- stuff -->

  <!-- load external section -->
  &sec;

  <!-- more stuff -->
</cfg>

и тривиальный файл сущности sec.xmlfwiw:

<?xml version="1.0" encoding="ISO-8859-1"?>
<sec>
  <prop name="myprop">0</prop>
</sec>

Я не включил DTD, потому что не думаю, что это имеет значение.

Используя Vala я загружаю документ с

doc = Xml.Parser.read_file (file_name, null,
                            Xml.ParserOption.DTDATTR |
                            Xml.ParserOption.NOENT |
                            Xml.ParserOption.DTDVALID)

и сохранить с

doc->save_file (file_name);

Возможно, есть промежуточный шаг с использованием писателя, которого я не вижу.

1 ответ

  1. Первым шагом является удаление опции NOENT, отключение расширения &sec;. Без NOENT необходимо обрабатывать узлы сущностей вручную. Но с NOENT, сущность заменяется во время синтаксического анализа, который не является обратимым. Может быть, это помогает в вашем случае, чтобы разобрать документ дважды, один раз с и один раз без NOENT?