【问题标题】:PHP: How to handle <![CDATA[ with SimpleXMLElement?PHP:如何使用 SimpleXMLElement 处理 <![CDATA[?
【发布时间】:2011-02-27 13:47:58
【问题描述】:

我注意到在包含这些 CDATA 标记的文档上使用 SimpleXMLElement 时,内容始终为 NULL。我该如何解决这个问题?

另外,很抱歉在这里发送有关 XML 的垃圾邮件。我一直在尝试让基于 XML 的脚本工作几个小时......

<content><![CDATA[Hello, world!]]></content>

如果您搜索“SimpleXMLElement cdata”,我在 Google 上尝试了第一次点击,但没有成功。

【问题讨论】:

  • 您是如何尝试访问节点值的?而且,SimpleXML 是必需的吗?
  • 我尝试了在网络上可以找到的所有其他函数(xml2array 和所有函数),SimpleXML 似乎是唯一能提供良好结果的函数,除了 CDATA 不工作。
  • 我们在工作中使用 DOMDocument (php.net/manual/en/class.domdocument.php) 进行了大量的 XML 解析。它在处理 CDATA 时效果很好。给我们一个简短的或发布更多代码,以了解您如何使用 SimpleXML。

标签: php xml tags cdata


【解决方案1】:

您可能没有正确访问它。您可以直接输出它或将其转换为字符串。 (在本例中,强制转换是多余的,因为 echo 无论如何都会自动执行)

$content = simplexml_load_string(
    '<content><![CDATA[Hello, world!]]></content>'
);
echo (string) $content;

// or with parent element:

$foo = simplexml_load_string(
    '<foo><content><![CDATA[Hello, world!]]></content></foo>'
);
echo (string) $foo->content;

LIBXML_NOCDATA 可能会让你的运气更好:

$content = simplexml_load_string(
    '<content><![CDATA[Hello, world!]]></content>'
    , null
    , LIBXML_NOCDATA
);

【讨论】:

  • 不,PHP 出于某种原因完全跳过了 CDATA。还有其他想法吗?
  • 那么这是一个错误。升级 PHP/libxml 直到它可以工作(我从来没有遇到过 CDATA 和 SimpleXML 的任何问题。)否则你可能想试试 LIBXML_NOCDATA 的运气。
  • 我知道这是一个旧答案,但我想强调这个答案的第一部分是正确的。当您使用print_r 打印结果时,您确实没有正确访问它。编写你真正想要的代码——可能使用echo,或者使用(string)演员,你会发现内容很好。 不要使用 LIBXML_NOCDATA 这是无关紧要的。
  • @IMSoP 添加 LIBXML_NOCDATA (并且什么都不改变)有效,所以我不太确定它是否无关紧要。
  • @SimonePalazzo XML 由各种不同的“节点”组成——例如&lt;anElement&gt;a text node &lt;aChildElement /&gt; &lt;![CDATA a cdata node]]&gt; another text node&lt;/anElement&gt;。 CDATA 和文本节点是不同的类型,SimpleXML 会跟踪这一点,因此您可以取回您放入的 XML。当您将 SimpleXML 对象压缩到数组中时,它会丢弃大量信息 - CDATA 节点、cmets、任何不属于在当前命名空间(例如&lt;someNSPrefix:someElement /&gt;)中,子元素在文本中的位置等。LIBXML_NOCDATA 将 CDATA 节点转换为文本节点,但不修复其余部分。
【解决方案2】:

这对我有用:

echo trim($entry->title);

【讨论】:

  • 如果您需要保留 cdata(没有 LIBXML_NOCDATA),那就完美了
【解决方案3】:

LIBXML_NOCDATAsimplexml_load_file() 函数的可选第三个参数。这将返回将所有 CDATA 数据转换为字符串的 XML 对象。

$xml = simplexml_load_file($this->filename, 'SimpleXMLElement', LIBXML_NOCDATA);
echo "<pre>";
print_r($xml);
echo "</pre>";


Fix CDATA in SimpleXML

【讨论】:

  • LIBXML_NOCDATA 是让这对我有用的原因。 PHP 5.3.5
  • 您的答案是解释 LIBXML_NOCDATA 含义的答案,谢谢!
【解决方案4】:

这对我来说是完美的。

$content = simplexml_load_string(
    $raw_xml
    , null
    , LIBXML_NOCDATA
);

【讨论】:

    【解决方案5】:

    什么时候使用LIBXML_NOCDATA

    我在将 XML 转换为 JSON 时添加了问题。

    $xml = simplexml_load_string("<foo><content><![CDATA[Hello, world!]]></content></foo>");
    echo json_encode($xml, true); 
    /* prints
       {
         "content": {}
       }
     */
    

    访问 SimpleXMLElement 对象时,它会获取 CDATA:

    $xml = simplexml_load_string("<foo><content><![CDATA[Hello, world!]]></content></foo>");
    echo $xml->content; 
    /* prints
       Hello, world!
    */
    

    我使用LIBXML_NOCDATA 是有意义的,因为json_encode 不访问SimpleXMLElement 来触发字符串转换功能,我猜__toString() 等效。

    $xml = simplexml_load_string("<foo><content><![CDATA[Hello, world!]]></content></foo>", null, LIBXML_NOCDATA);
    echo json_encode($xml);
    /*
     {
       "content": "Hello, world!"
     }
    */
    

    【讨论】:

      猜你喜欢
      • 2011-09-09
      • 2014-10-27
      • 2013-07-05
      • 2023-03-05
      • 1970-01-01
      • 2013-02-11
      相关资源
      最近更新 更多