【问题标题】:simplexml_load_file ignore the DTDsimplexml_load_file 忽略 DTD
【发布时间】:2013-06-24 08:11:15
【问题描述】:

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

【问题讨论】:

    标签: php xml simplexml dtd


    【解决方案1】:

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

    【讨论】:

    • 好吧,您可以传递额外的 Lbixml 参数并且其中一个参数是 LIBXML_DTDVALID 的事实让我认为 simplexml_load_file 可以执行验证。我会阅读那篇文章,看看它是否有帮助。谢谢
    • 啊,好点子!我忽略了这一点。唔。在那种情况下,你试过libxml-use-internal-errors()libxml-get-errors()吗?
    • 好吧,我最终从文件中创建了一个 DOMDocument,对其进行验证,然后,如果一切正常,使用 simplexml_import_dom 来创建一个 SimpleXMLElement 对象。它工作得非常好,通过使用 libxml-get-errors() 我能够修饰错误消息,这要感谢这里的一篇文章 [ibm.com/developerworks/library/x-validxphp/index.html]
    猜你喜欢
    • 2010-09-14
    • 2023-03-22
    • 1970-01-01
    • 2012-07-04
    • 2018-08-22
    • 2011-04-23
    • 2012-10-15
    相关资源
    最近更新 更多