Как проанализировать искаженный RSS-канал со сторонних сайтов, используя php?

#php #xml #xml-parsing #rss

#php #xml #xml-синтаксический анализ #RSS-канал

Вопрос:

Я пытаюсь проанализировать RSS-каналы из некоторых средств массовой информации. Мой скрипт работает для большинства из них. Проблема в том, что мне нужно объединить их все, даже если они искажены.

Мне не удается получить описание этих двух каналов. Как я мог продолжить в любом случае?

Вот мой скрипт :

 <?php
function RSS_items ($url) {
    $i = 0;
    $doc = new DOMDocument();
    $doc->load($url);
    $channels = $doc->getElementsByTagName('channel');
    foreach($channels as $channel) {
        $items = $channel->getElementsByTagName('item');
        foreach($items as $item) {
            $i  ;
            $y[$i]['title'] = $item->getElementsByTagName('title')->item(0)->firstChild->textContent;
            $y[$i]['link'] = $item->getElementsByTagName('link')->item(0)->firstChild->textContent;
            $y[$i]['updated'] = $item->getElementsByTagName('pubDate')->item(0)->firstChild->textContent;
            $y[$i]['description'] = $item->getElementsByTagName('description')->item(0)->firstChild->textContent;
        }
    }
    echo '<pre>';
    print_r ($y);
    echo '</pre>';
}
// the two malformed feeds
RSS_items ('http://www.lefigaro.fr/rss/figaro_actualites-a-la-une.xml');
RSS_items ('https://francais.rt.com/rss');
?>
 

Комментарии:

1. Код не работает для какого из них? Возвращает ли какую-либо ошибку?

2. Это не работает для них обоих. Ошибки нет. Он не анализирует описание.

3. Возможно, проблема в использовании firstChild . Поскольку выбранный тег не имеет дочерних элементов, которые вы хотите выбрать первым из них. Когда я удалил его, код заработал.

4. Да, спасибо. Это из-за разрывов строк в начале каждого описания? Мне просто интересно, почему исходный скрипт (который не мой) был закодирован firstchild .

Ответ №1:

Проблема вашего кода заключается в использовании firstChild свойства, которое выбирает первый дочерний элемент элемента. Но в целевом XML у description тега нет дочерних элементов, которые вы хотите выбрать первым из них. Удалите его из кода. Результат должен быть таким

 $item->getElementsByTagName('description')->item(0)->textContent;
 

Комментарии:

1. Значит, я должен удалить firstchild только для description тега? Как я уже говорил вам выше, мне было интересно, почему исходный скрипт (который не мой) был закодирован firstchild . Единственный description тег без firstchild ?

2. @Guillaume Как я уже сказал в ответе firstChild , выберите дочерний элемент элемента. Если у другого тега нет дочернего элемента, вы можете удалить его.

3. Я знаю, что firstchild рассматривает CSS. Но мне неудобно в контексте XML. Я нашел это: «Element nodes имеет тип узла 1, поэтому, если первый дочерний узел не является узлом элемента, он переходит к следующему узлу и проверяет, является ли этот узел узлом элемента. Это продолжается до тех пор, пока не будет найден первый дочерний узел (который должен быть узлом элемента). Таким образом, результат будет корректным во всех браузерах «. Итак, кажется, что если я хочу, чтобы мой скрипт работал со ВСЕМИ каналами, мне нужно проверить тип первичного дочернего элемента, а затем принять во внимание, является ли это текстовым объектом или разделом CDATASection. Я прав?

4. @Guillaume Да, но вы должны выполнять эту работу, когда ваш тег имеет несколько дочерних элементов. Например, если description тег имеет несколько дочерних элементов, вы должны выполнить итерацию по дочерним элементам и проверить, является ли тип дочернего элемента text или CDATA.

5. Извините, английский не мой родной язык, и у меня есть некоторые трудности с объяснением того, чего я не понимаю. В контексте XML description -тега, что такое firstchild ? Не могли бы вы показать мне description тег с a firstchild и description тег с несколькими дочерними элементами, пожалуйста?