Парсинг 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]);
}