PHP:如何处理<! - [CDATA [with SimpleXMLElement? - >

时间:2010-06-03 23:48:39

标签: php xml tags cdata

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

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

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

如果您搜索“SimpleXMLElement cdata”,我尝试了第一次点击Google,但这不起作用。

5 个答案:

答案 0 :(得分:156)

您可能无法正确访问它。您可以直接输出或将其转换为字符串。 (在这个例子中,转换是多余的,因为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
);

答案 1 :(得分:38)

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

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


Fix CDATA in SimpleXML

答案 2 :(得分:12)

这对我有用:

echo trim($entry->title);

答案 3 :(得分:8)

这对我来说非常合适。

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

答案 4 :(得分:0)

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