Чтение текста в `‹![CDATA[]]›` с помощью SimpleXMLElement

Я импортирую RSS-канал с SimpleXMLElement в PHP. У меня проблемы с заголовком и описанием. По какой-то причине веб-сайт, с которого я получаю ленту, помещает заголовок и описание в <![CDATA[...]]>:

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

Когда я делаю var_dump() для SimpleXMLElement, я получаю (для этой части):

  [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..."
  }

Как получить значение in <![CDATA[...]]> для чтения заголовка и описания из фида?


person Community    schedule 30.05.2013    source источник


Ответы (1)


SimpleXML читает узлы CDATA абсолютно нормально. Единственная проблема заключается в том, что print_r, var_dump и подобные функции не дают точного представления объектов SimpleXML, поскольку они не полностью реализованы в PHP.

Если вы запустите echo $myNode->description, вы прекрасно увидите содержимое раздела CDATA. Причина в том, что когда вы запрашиваете преобразование SimpleXMLElement в строку, он автоматически объединяет для вас весь текст и содержимое CDATA, но пока вы этого не сделаете, он запоминает различие.

В общем случае, чтобы извлечь строковое содержимое любого элемента или атрибута в SimpleXML, приведите его к строке с помощью (string)$myNode. Это также предотвращает другие проблемы, такие как жалобы функций на получение объекта, когда они ожидали строку, или сбой сериализации при сохранении в сеанс.

См. также мой предыдущий ответ по адресу https://stackoverflow.com/a/13830559/157957.

person IMSoP    schedule 30.05.2013