Парсинг RSS с PHP

Я пытаюсь разобрать RSS: http://www.mlssoccer.com/rss/en.xml.

$feed = new DOMDocument();
$feed->load($url)
$items = $feed->getElementsByTagName('channel')->item(0)->getElementsByTagName('item');

foreach($items as $key => $item) 
{
    $title = $item->getElementsByTagName('title')->item(0)->firstChild->nodeValue;
    $pubDate = $item->getElementsByTagName('pubDate')->item(0)->firstChild->nodeValue;
    $description = $item->getElementsByTagName('description')->item(0)->firstChild->nodeValue;
    // do some stuff
}

Дело в том, что я получаю "$ title" и "$ pubDate" без проблем, но по какой-то причине "$ description" всегда пусто, в нем ничего нет. В чем может быть причина такого поведения и как это исправить?

2 ответа

Решение

Проблема была с CDATA, вам нужно использовать textContent вместо nodeValue, чтобы получить значение между

<?php

$feed = new DOMDocument();
$feed->load('http://www.mlssoccer.com/rss/en.xml');
$items = $feed->getElementsByTagName('channel')->item(0)->getElementsByTagName('item');

foreach($items as $key => $item) 
{
    $title = $item->getElementsByTagName('title')->item(0)->firstChild->nodeValue;
    $pubDate = $item->getElementsByTagName('pubDate')->item(0)->firstChild->nodeValue;
    $description = $item->getElementsByTagName('description')->item(0)->textContent; // textContent

}

Здесь могут быть пробелы между открытием <description> тег и открытие <![CDATA[, Это текстовый узел.

Так что если вы обращаетесь к первому ребенку description, вы можете получить этот пробельный текстовый узел.

В общем случае вы можете настроить DOMdocument на игнорирование пробельных узлов:

$feed = new DOMDocument();
$feed->preserveWhiteSpace  = FALSE;
$feed->load($url);

Кроме того, вы должны проверить XPath, это делает чтение DOM намного проще:

$xpath = new DOMXpath($feed);

foreach ($xpath->evaluate('//channel/item') as $item) {
    $title = $xpath->evaluate('string(title)', $item);
    $pubDate = $xpath->evaluate('string(pubDate)', $item);
    $description = $xpath->evaluate('string(description)', $item);
    // do some stuff
    var_dump([$title, $pubData, $description]);
}
Другие вопросы по тегам