2013-05-05 153 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