2010-06-03 125 views
78

我注意到,在包含这些CDATA标签的文档上使用SimpleXMLElement时,内容始终为NULL。我该如何解决?PHP:如何处理<![CDATA [with SimpleXMLElement?

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

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

我试着在谷歌的第一击,如果你搜索“的SimpleXMLElement CDATA”,但没有奏效。

+0

您如何访问节点值?而且,是否需要SimpleXML? – allnightgrocery 2010-06-03 23:58:17

+0

我尝试了所有可以在网上找到的函数(xml2array和all),并且SimpleXML似乎是唯一一个可以提供良好结果的函数,除了CDATA无效。 – Angelo 2010-06-04 00:02:49

+1

我们使用DOMDocument进行了大量的XML解析(http://www.php.net/manual/en/class.domdocument.php)。它在处理CDATA方面工作得很好。给我们一个简短的或多一点的代码,让我们看看你如何使用SimpleXML。 – allnightgrocery 2010-06-04 00:51:43

回答

138

您可能没有正确访问它。您可以直接输出或将其转换为字符串。 (在这个例子中,铸造是多余的,因为回声自动执行也无妨)

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

不,PHP由于某种原因完全跳过了CDATA。 有没有其他想法? – Angelo 2010-06-04 00:24:08

+4

然后这是一个错误。升级PHP/libxml直到它正常工作(我从来没有遇到任何CDATA和SimpleXML问题)。否则,您可能想用LIBXML_NOCDATA尝试运气。 – 2010-06-04 01:56:08

+0

对。如果没有LIBXML_NOCDATA,那么XML会以false的形式出现 - 不管它是如何完成的。我能够证明这两种创建方法... $ x = new SimpleXMLElement('<![CDATA [Hello,world!]]>',LIBXML_NOCDATA); $ y = simplexml_load_string('<![CDATA [Hello,world!]]> ',“SimpleXMLElement”,LIBXML_NOCDATA); print_r($ y); 没有这个选项,它们都是空的。 只是想支持你的主张。 – allnightgrocery 2010-06-04 02:09:57

10

这并获得成功对我来说:

echo trim($entry->title); 
+0

完美的,如果你需要保持cdata(没有LIBXML_NOCDATA) – maztch 2013-05-10 17:46:38

30

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

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


Fix CDATA in SimpleXML

+0

LIBXML_NOCDATA是什么使这项工作为了我。 PHP 5.3.5 – 2017-04-21 19:27:57

+0

您的答案是解释** LIBXML_NOCDATA **含义的答案,谢谢! – 2017-06-08 15:38:46

4

这是工作非常适合我。

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