2013-05-05 149 views
1

我的感覺真的誤會與XML DTD的:我包括衝突與DTD

在一個XML文件(該文件已經得到了DOCTYPE)與實體另一個XML文件(這也有一個DOCTYPE)。我的解析器對此感到憤怒。

我知道問題在於Doctype,因爲如果我刪除它,一切都可以。但是我可以沒有它,我需要包含其他XML文件在XML中的最終文件。

這裏是/datas.xml:

<?xml version="1.0" encoding="UTF-8" ?> 
<!DOCTYPE datas [ 
    <!ENTITY Path_datas SYSTEM "Path/datas.xml" > 
]> 
<datas> 
    &Path_datas; 
</datas> 

這裏是/Path/datas.xml:

<?xml version="1.0" encoding="UTF-8" ?> 
<!DOCTYPE oolodatas [ 
    <!ENTITY Local_DefaultProject_Box_datas SYSTEM "Local/DefaultProject/Box/datas.xml" > 
]> 
<datas> 
    <box> 
     LOL 
    </box> 
</datas> 

因此,在一個PHP文件我這樣做:

$datas = simplexml_load_file(realpath('maforge/datas/datas.xml'), NULL, LIBXML_NOENT); 
var_dump($datas->asXML()); 

這裏我得到的錯誤:

(!)

SCREAM:錯誤抑制被忽略(! )警告: 使用simplexml_load_file(): 文件:/// C:/wamp/www/forge/Path/datas.xml:2: 分析器錯誤:開始標記:無效的元素名稱

感謝您的幫幫我 !

回答

2

DOCTYPE聲明只能出現在主XML文檔(「文檔實體」)中,而不出現在包含文檔(「外部實體」)中。

+0

好的,謝謝你的精確度。我一直在互聯網上搜索一個正確的方法來使用XML包括蛔蟲。簡而言之,我已經有了一個樹狀的劇目和XML文件。在每個劇目中,我都需要一個文件,其中包括他的劇目的所有文件,遞歸地。如果我找不到解決方案,我將使用PHP來完成此任務。 – 2013-05-05 18:50:08

+2

你看過XInclude了嗎? – 2013-05-05 20:01:06

+0

太棒了!謝謝 !我想知道爲什麼我的書沒有提到它,但這是因爲它太舊了!無論如何,這本書是一本非常棒的書,但現在我會密切關注「新聞」,或者購買更新的書。我使用類DOMDocument來完成PHP中的包含,因爲它似乎是SimpleXML無法處理它。再次感謝你的幫助。真棒社區。 – 2013-05-05 23:27:14