2016-09-29 9 views
0

我的应用程序从XML加载配置并使用作为实体读入的多个文件,但是当我将文档保存回去时,它将所有文件合并为一个文件。这不是最糟糕的事情,但如果更改结束在单独的实体中会更好。如果这是一个选项,我愿意使用XSD语法,而不是DTD,如果可能的话,我想尽量避免使用XSD语法,但必须将每个文件作为单独的文档加载并手动合并。使用libxml保存带有外部实体的XML文件而不合并到一个

样本配置:

<?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?

相关问题