【问题标题】:Problem with simpleXML and entity not being defined未定义 simpleXML 和实体的问题
【发布时间】:2009-09-15 12:22:03
【问题描述】:

我正在尝试解析 XML 文件,但在加载它时 simpleXML 会打印以下警告:

警告:simplexml_load_file() [function.simplexml-load-file]:gpr_545.xml:55:解析器错误:实体“Oslash”未在第 35 行的 import.php 中定义

这是那行:

<forenames>B&Oslash;IE</forenames><x> </x>

因为这是一个警告,我可能会忽略它,但我想了解发生了什么。

【问题讨论】:

    标签: php xml simplexml


    【解决方案1】:

    &Oslash 之类的 HTML 实体与 XML 实体不同。 Here's a table 用于将 HTML 实体替换为 XML 实体。

    从您的一个 cmets 到另一个帖子,我可以告诉您,您遇到了实体 &sol; 的问题。我不知道这是否是一个有效的 HTML 实体,我的 Firefox 不会显示该字符 - 只会输出实体名称。但我为大多数实体及其字符参考号找到了an other table。尝试将它们添加到您的替换表中,您应该是安全的。 &sol;的参考编号是/顺便说一句。

    【讨论】:

    • 非常感谢 Björn 的餐桌,救了我的命!
    • 第一个链接不再可用,但第二个链接工作正常。
    • 两个链接都失效了。
    【解决方案2】:

    Latin1 字符的 HTML 编码(如 Ø,该字符所描述的内容)破坏了 XML 解析器。如果您可以控制数据,则需要使用 XML 样式的字符编码对其进行转义(Ø 恰好是 Ø)

    【讨论】:

    • 是的,无情的 XML 解析器在期望对非 ASCII 字符进行 XML 样式编码并被赋予 HTML 样式编码时会中断。
    • 好的。所以我只是解析这个。我从 Björn 的回答中查看了该表,它适用于我的第一个示例,但下一个问题是该表中没有的这个实体:&sol; .有没有更稳定的解决方案?
    • XSLT 在将文档传递给 XML 解析器之前对其进行转换是一种解决方案。
    【解决方案3】:

    我认为这是一个编码问题。 php,在这种特殊情况下的 simplexml,不喜欢你在那个 fornames 标记中得到的丹麦语 O。您可以尝试在 utf-8 中对整个文件进行编码,然后从标签中删除转义版本。之后,您可以将完全转义的无字符文件读入 simplexml。

    K

    【讨论】:

    • 不确定您的意思。此 xml 文件编码为 ISO-8859-1 ()。
    • 正确:使用 utf-8 代替 iso-8859-1
    • yepp,并使用 utf8_encode() 对文本进行实际编码。
    • 如果我是作者,那是有道理的,但可以这么说;-)
    • 你得到了文件,所以你可以逐行读取它并对其进行编码——不是吗?我碰巧为一位日本客户编写了一个 xmlfilter 应用程序。相信我,在实际解析支付之前做这个额外的步骤...... ;)
    【解决方案4】:

    刚刚遇到一个非常相似的问题,用下面的方法解决了。主要思想是将文件加载到字符串中,将所有坏实体替换为“[[entity]]Oslash;”并在显示一些xml节点之前进行反向替换。

    function readXML($filename){
        $xml_string = implode("", file($filename));
        $xml_string = str_replace("&", "[[entity]]", $xml_string);
        return simplexml_load_string($xml_string);
    }
    function xml2str($xml){
        $str = str_replace("[[entity]]", "&", (string)$xml);
        $str = iconv("UTF-8", "WINDOWS-1251", $str);
        return $str;
    }
    $xml = readXML($filename);
    echo xml2str($xml->forenames);
    

    iconv("UTF-8", "WINDOWS-1251", $str) 因为我的页面上有“WINDOWS-1251”编码

    【讨论】:

      【解决方案5】:

      尝试使用这一行:

      <forenames><![CDATA[B&Oslash;IE]]></forenames><x> </x>
      

      并阅读this about CDATA

      【讨论】:

      • 在解析之前,您应该为每个带有“奇怪”字符的实体插入 CDATA 标记。
      • 如果里面有这个错误,那么它就不是有效的xml。由您来告诉原作者修复它或在解析和包装无效块之前进行此类检查
      猜你喜欢
      • 2021-03-17
      • 1970-01-01
      • 2011-02-20
      • 1970-01-01
      • 1970-01-01
      • 2011-08-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多