simplexml_load_file忽略DTD

时间:2012-09-13 15:52:06

标签: php xml simplexml dtd

我使用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位于同一目录中。

1 个答案:

答案 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接口进行验证。