парсер на PHP c и <[!CDATA[много текста]]>
С помощью simplexml_load_file($url, "SimpleXMLElement", LIBXML_NOCDATA) добился следующего:
Имею теперь почти читаемый массив:
[19] => SimpleXMLElement Object
(
[title] => В Канске вернувшийся из мест заключения отец устроил своим детям урок "воспитания"
[pubDate] => Wed, 01 Mar 2023 14:22:36 +0700
[category] => Канск
[yandex:full-text] => В Канске у неоднократно судимого местного жителя изъяты дети....<br>
)
Данная !CDATA раскрылась. Но я так и не смог вытащить данные из [yandex:full-text]. !Старый код работающий без CDATA c яндекс-тегом yandex:full-text, тоже не смог $full_text=$item->children('yandex',true);
Как быть? И что делать?
Ответы (2 шт):
Скорее всего вам и не нужен флаг LIBXML_NOCDATA. Достать строку из тега <yandex:full-text /> можно приведением объекта к строке, даже, если содержимое тега заключено в <![CDATA[...]]>.
Если у вас валидный XML с определенными неймспейсами, как в этом примере, то это можно сделать так:
$rss = simplexml_load_file(__DIR__ . '/rss.xml');
foreach ($rss->channel->item as $item) {
$fullText = (string) $item->children('yandex', true)->{'full-text'};
// или
$fullText = (string) $item->children('http://news.yandex.ru')->{'full-text'};
print "{$fullText}\n";
}
Единственная польза от LIBXML_NOCDATA в том, что при вызове var_dump или print_r, вы будете видеть содержимое узлов с CDATA.
Реализовал так:
foreach ( $xml->channel->item as $key => $item)
{
$full_text_preview=mb_substr((string)$item->{'yandex:full-text'}, 0, $count_simbols, 'utf-8');
$full_text=(string)$item->{'yandex:full-text'};
}