我使用simplexml_load_file来解析必须遵循DTD的XML文件。 XML和DTD都是本地文件。
$obj_xml = simplexml_load_file(
$str_xml_file,
'SimpleXMLElement',
LIBXML_DTDVALID + LIBXML_NOENT
);
if (false === $obj_xml) {
throw new Exception("XML file is not valid");
}
XML文件是这样的
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapping SYSTEM 'mapping.dtd' [
<!ENTITY data_file "data.csv">
]>
<mapping>
...
</mapping>
我的印象是,如果XML根据指定的DTD无效,那么simplexml_load_file将返回false,但它不会返回false。我也试过检查$ obj_xml是否是LibXMLError类的一个实例,但结果相同。
似乎DTD完全被simplexml_load_file忽略。我试过更改它的名字,到某些不存在但仍然没有错误。
正如我所说,XML和DTD都是本地文件。 $ str_xml_file是XML文件的绝对完整路径名,DTD位于同一目录中。
答案 0 :(得分:0)
the documentation I see on the Web中没有任何内容表明simplexml_load_file
执行验证。实际上,我在SimpleXML文档中没有看到任何暗示它可以完全验证XML的内容。
[共识[(http://www.ibm.com/developerworks/xml/library/x-simplexml/index.html)似乎是SimpleXML没有验证工具; IBM DeveloperWorks有an article,表明您需要使用DOM接口进行验证。