112

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

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

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

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


您可能没有正确访问它。您可以直接输出它或将其转换为字符串。(在此示例中,强制转换是多余的,因为 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
);
4

5 回答 5

200

您可能没有正确访问它。您可以直接输出它或将其转换为字符串。(在此示例中,强制转换是多余的,因为 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
);
于 2010-06-04T00:13:04.817 回答
62

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

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


修复 SimpleXML 中的 CDATA

于 2014-03-25T06:30:37.467 回答
14

这对我有用:

echo trim($entry->title);
于 2012-11-24T12:08:21.153 回答
13

这对我来说很完美。

$content = simplexml_load_string(
    $raw_xml
    , null
    , LIBXML_NOCDATA
);
于 2016-01-25T10:05:53.940 回答
1

何时使用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!"
 }
*/
于 2020-04-17T07:19:33.047 回答