Мое приложение загружает конфигурацию из XML и работает с несколькими файлами, считанными как сущности, но когда я сохраняю документ, он объединяет все файлы в один. Это не самое худшее, но было бы лучше, если бы изменения оказались в отдельных сущностях. Я готов использовать синтаксис XSD вместо DTD, если это вариант, чего бы я хотел избежать, если это возможно, хотя мне приходится загружать каждый файл в виде отдельных документов и объединять их вручную.Сохранение XML-файлов с внешними объектами с использованием libxml без объединения в один
Пример конфигурации:
<?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.xml
FWIW:
<?xml version="1.0" encoding="ISO-8859-1"?>
<sec>
<prop name="myprop">0</prop>
</sec>
Я не включил DTD, потому что я не думаю, что имеет значение.
Использование Вала я загрузить документ с
doc = Xml.Parser.read_file (file_name, null,
Xml.ParserOption.DTDATTR |
Xml.ParserOption.NOENT |
Xml.ParserOption.DTDVALID)
и сохранить
doc->save_file (file_name);
Может быть, есть стадия посредника с использованием писателя, что я не вижу.
Первым шагом является удаление опции «NOENT», отключение расширения «&sec;». – nwellnhof
Я думал, что это может быть частью проблемы, но если этого нет, он вообще не загружает сущности. – geoffjay
Да, без «NOENT» вы должны обрабатывать сущности узлов вручную. Но с 'NOENT', сущность заменяется во время разбора, которая не обратима. Может быть, это поможет в вашем случае разобрать документ дважды, один раз и один раз без «NOENT»? – nwellnhof