2016-09-29 30 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?

相關問題