PHP: 如何使用 SimpleXMLElement 处理 < ! [ CDATA [ ?

我注意到,当对包含这些 CDATA 标记的文档使用 SimpleXMLElement时,内容总是 NULL。我该怎么补救?

另外,很抱歉在这里发送关于 XML 的垃圾信息。我已经花了几个小时试图让一个基于 XML 的脚本运行起来..。

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

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

154969 次浏览

You're probably not accessing it correctly. You can output it directly or cast it as a string. (in this example, the casting is superfluous, as echo automatically does it anyway)

$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
);

这对我有效:

echo trim($entry->title);

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

This is working perfect for me.

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

什么时候使用 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!"
}
*/

当直接使用 SimpleXMLElement类时

new SimpleXMLElement($rawXml, LIBXML_NOCDATA);