我觉得用XML真正误解了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: 解析器错误:StartTag:无效的元素名称
感谢您的帮助!
答案 0 :(得分:2)
DOCTYPE声明只能出现在主XML文档(“文档实体”)中,而不能出现在包含的文档(“外部实体”)中。