如何访问<;内容:编码>;使用RSS源中的CDATA


How to access <content:encoded> with CDATA from RSS feed?

问题

如果您尝试访问RSS提要中的<content:encoded>,结果将为null。

XML

<rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/">
    <channel>
        <item>
        <pubDate>Tue, 16 Jun 2015 14:58:15 +0200</pubDate>
        <title>title</title>
        <link>/your/path/</link>
        <description>description</description>
        <content:encoded>
        <![CDATA[
        <p>content</p>
        ]]>
        </content:encoded>
        </item>
    </channel>
</rss>

PHP

$data = simplexml_load_string($xml);
foreach ($data->channel->item as $item){
    $title = $item->title;
    var_dump($title); //title
    $content = $item->content;
    var_dump($content); //null
}

问题

如何访问内容并保存<p>content</p>

元素的名称不是content,而是encodedcontent:是"名称空间前缀",在文档顶部绑定到名称空间标识符"http://purl.org/rss/1.0/modules/content/"

因此,您需要使用->children()方法来选择正确的命名空间:

echo $item->children('http://purl.org/rss/1.0/modules/content/')->encoded;

(显然,您可能会将名称空间标识符放在某个变量或常量中,以避免每次需要时都粘贴它。(

请注意,我在这里使用了echo,而不是var_dumpvar_dump不能很好地处理SimpleXML(反之亦然?(,并且会使它看起来缺少CDATA内容。另一方面,echo隐式转换为字符串以获取内容,这很好。在实际代码中,您可能希望明确地获取字符串内容,如以下所示:

$encoded_content = (string) $item->children('http://purl.org/rss/1.0/modules/content/')->encoded;