我正在使用 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,但事实并非如此。我还尝试检查 $obj_xml 是否是 LibXMLError 类的实例,但结果相同。
似乎 simplexml_load_file 完全忽略了 DTD。我尝试将其名称更改为不存在的名称,但仍然没有错误。
正如我所说,XML 和 DTD 都是本地文件。$str_xml_file 是 XML 文件的绝对完整路径名,DTD 位于同一目录中。