парсер на PHP c <Yandex:full-text> и <[!CDATA[много текста]]>

Рейтинг: 0Ответов: 2Опубликовано: 28.03.2023

С помощью 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);
Как быть? И что делать?

Ответы

▲ 0Принят

Реализовал так:

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'};
    }
▲ 0

Скорее всего вам и не нужен флаг 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.