【问题标题】:PHP DOMDocument->loadXML with XML containing ampersand/less/greater?PHP DOMDocument-> loadXML 与 XML 包含 &/less/greater?
【发布时间】:2011-01-04 04:45:48
【问题描述】:

我正在尝试解析 TEXTDATA 中包含字符 & 的 XML 字符串。通常,这些字符应该是 htmlencoded,但在我的情况下,它们不是,所以我收到以下消息:

警告:DOMDocument::loadXML() [function.loadXML]:在实体中解析属性名称时出错... 警告:DOMDocument::loadXML() [function.loadXML]: 找不到开始标记的结尾...

我可以使用 str_replace 对所有 & 进行编码,但如果我使用 进行编码,我也会对有效的 XML 标记进行编码。

有人知道这个问题的解决方法吗??

谢谢!

【问题讨论】:

  • 非格式良好的 XML 的解决方法是责怪编写它的人 :)

标签: php xml domdocument ampersand


【解决方案1】:

我可以使用 str_replace 对所有 & 进行编码,但如果我使用 进行编码,我也会对有效的 XML 标记进行编码。

作为一种严格的临时修复措施,您可以替换那些不属于标签或实体引用的部分,例如:

$str= preg_replace('<(?![a-zA-Z_!?])', '&lt;', $str);
$str= preg_replace('&(?!([a-zA-Z]+|#[0-9]+|#x[0-9a-fA-F]+);)', '&amp;', $str);

但是,这并不是无懈可击的,从长远来看,您需要修复产生这种虚假标记的任何东西,或者对需要修复它的人大喊大叫,直到他们得到线索为止。根据定义,像这样的格式不正确的 XML 根本不是 XML

【讨论】:

    【解决方案2】:

    将所有文本放入 CDATA 元素中?

    <!-- Old -->
    <blah>
        x & y < 3
    </blah>
    
    <!-- New -->
    <blah><![CDATA[
        x & y < 3
    ]]></blah>
    

    【讨论】:

      【解决方案3】:

      如果 XML 中有 它不是有效的 XML。尝试对其进行编码或将它们包含在&lt;![CDATA[中。

      如果不可能(因为您没有输出此“XML”),我建议尝试使用一些 Html 解析库(我没有使用它们,但它们存在)因为它们没有 XML 严格那些。

      但我真的会在尝试任何其他事情之前尝试获取有效的 XML!

      【讨论】:

      • 感谢您的提示。我将首先看看是否可以更改传入的 XML 流,如果没有,我将尝试 HTML 解析器...
      【解决方案4】:

      我经常在调用 DomDocument 的 load() 之前使用 @,主要是因为您永远无法绝对确定您加载的内容是否符合您的预期。

      使用@ 将抑制错误。

      @$dom->loadXml($myXml);
      

      【讨论】:

      猜你喜欢
      • 2011-08-03
      • 2014-05-03
      • 1970-01-01
      • 1970-01-01
      • 2013-01-27
      • 1970-01-01
      • 2012-05-06
      • 1970-01-01
      • 2011-11-17
      相关资源
      最近更新 更多