使用SimpleXMLElement读取`<! - [CDATA [...]] - >`中的文本

时间:2013-05-30 11:45:14

标签: php xml simplexml cdata

我正在PHP中导入带有SimpleXMLElement的RSS源。我的标题和描述有问题。出于某种原因,我从Feed获得的网站将标题和说明放在<![CDATA[...]]>

<item>
<title><![CDATA[...title...]]></title>
<link>...url...</link>
<description><![CDATA[...title...]]></description>
<pubDate>...date...</pubDate>
<guid>...link...</guid>
</item>

当我在SimpleXMLElement上执行var_dump()时,我得到了(对于这部分):

  [2]=>
  object(SimpleXMLElement)#5 (5) {
    ["title"]=>
    object(SimpleXMLElement)#18 (0) {
    }
    ["link"]=>
    string(95) "...link..."
    ["description"]=>
    object(SimpleXMLElement)#19 (0) {
    }
    ["pubDate"]=>
    string(31) "...date..."
    ["guid"]=>
    string(48) "...link..."
  }

如何从 <![CDATA[...]]>中获取值以阅读Feed中的标题和说明?

1 个答案:

答案 0 :(得分:13)

SimpleXML绝对可以读取CDATA节点。您遇到的唯一问题是print_rvar_dump和类似函数无法准确表示SimpleXML对象,因为它们并未在PHP中完全实现。

如果你运行echo $myNode->description,你会看到CDATA部分的内容就好了。原因是当您要求将SimpleXMLElement转换为字符串时,它会自动将所有文本和CDATA内容组合在一起 - 但在您这样做之前,它会记住这种区别。

作为一般情况,要在SimpleXML中提取任何元素或属性的字符串内容,请使用(string)$myNode强制转换为字符串。这也可以防止其他问题,例如函数抱怨在期望字符串时获取对象,或者在保存到会话时无法序列化。

另请参阅我之前在https://stackoverflow.com/a/13830559/157957

的回答