php 如何< content:encoded>从RSS源访问CDATA?[duplicate]

2guxujil  于 2023-02-15  发布在  PHP
关注(0)|答案(1)|浏览(97)
    • 此问题在此处已有答案**:

[PHP: How to handle <![CDATAwith SimpleXMLElement?(6个答案)
Reference - How do I handle Namespaces (Tags and Attributes with a Colon in their Name) in SimpleXML?(2个答案)
七年前就关门了。

问题

如果您尝试访问RSS提要中的<content:encoded>,结果将为空。
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>

yx2lnoni

yx2lnoni1#

元素的名称不是content,而是encoded;content:是“命名空间前缀”,在文档的顶部绑定到命名空间标识符"http://purl.org/rss/1.0/modules/content/"
因此,您需要使用the ->children() method来选择正确的名称空间:

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

(显然,您可能会将名称空间标识符放入某个变量或常量中,以避免每次需要时都粘贴它。)
注意,这里我使用的是echo,而不是var_dump;var_dump不能很好地科普SimpleXML(反之亦然?),并且会使它看起来像是丢失了CDATA内容。另一方面,echo隐式转换为string以获取内容,这可以正常工作。在真实的代码中,您可能希望显式获取字符串内容,如下所示:

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

相关问题