2016-09-29 1 views
0

Мое приложение загружает конфигурацию из 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); 

Может быть, есть стадия посредника с использованием писателя, что я не вижу.

+0

Первым шагом является удаление опции «NOENT», отключение расширения «&sec;». – nwellnhof

+0

Я думал, что это может быть частью проблемы, но если этого нет, он вообще не загружает сущности. – geoffjay

+1

Да, без «NOENT» вы должны обрабатывать сущности узлов вручную. Но с 'NOENT', сущность заменяется во время разбора, которая не обратима. Может быть, это поможет в вашем случае разобрать документ дважды, один раз и один раз без «NOENT»? – nwellnhof

ответ

0

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