DOMDocument :: getElementsByTagName не захватывает канал в PHP - PullRequest
0 голосов
/ 24 февраля 2012

Использование DomDocument для получения RSS-каналов, но они столкнулись со странной проблемой. Если я возьму какой-нибудь канал RSS типа http://rss.slashdot.org/Slashdot/slashdot, он будет работать нормально. Тем не менее, RSS-канал, который я пытаюсь разобрать, вызывает у меня проблемы: http://www.ryanhache.com/feed

Кажется, он не может найти тег канала, а затем перебрать его. Функции, которые я унаследовал, следующие и вызываются с помощью RSS_Retrieve ($ url). Чего мне не хватает в этих функциях или что-то не так с подачей, которую я вытягиваю?

function RSS_Tags($item, $type)
{
    $y = array();
    $tnl = $item->getElementsByTagName("title");
    $tnl = $tnl->item(0);
    $title = $tnl->firstChild->textContent;

    $tnl = $item->getElementsByTagName("link");
    $tnl = $tnl->item(0);
    $link = $tnl->firstChild->textContent;

    $tnl = $item->getElementsByTagName("pubDate");
    $tnl = $tnl->item(0);
    $date = $tnl->firstChild->textContent;

    $tnl = $item->getElementsByTagName("description");
    $tnl = $tnl->item(0);
    $description = $tnl->firstChild->textContent;

    $y["title"] = $title;
    $y["link"] = $link;
    $y["date"] = $date;
    $y["description"] = $description;
    $y["type"] = $type;

    return $y;
}

function RSS_Channel($channel)
{
    global $RSS_Content;

    $items = $channel->getElementsByTagName("item");

   // Processing channel

   $y = RSS_Tags($channel, 0);      // get description of channel, type 0
   array_push($RSS_Content, $y);

   // Processing articles

   foreach($items as $item)
   {
       $y = RSS_Tags($item, 1); // get description of article, type 1
       array_push($RSS_Content, $y);
   }
}

function RSS_Retrieve($url)
{
   global $RSS_Content;

   $doc  = new DOMDocument();
   $doc->load($url);

   $channels = $doc->getElementsByTagName("channel");

   $RSS_Content = array();

   foreach($channels as $channel)
   {
       RSS_Channel($channel);
   }

}

1 Ответ

1 голос
/ 24 февраля 2012

Ваш код работает, но задача может быть выполнена намного проще и без использования глобальной переменной.

function RSS_Tags($node, $map, $type) {
    $item = array();
    foreach ($map as $elem=>$key) {
        $item[$key] = (string) $node->{$elem};
    }
    $item['type'] = $type;
    return $item;
}

function RSS_Retrieve($url) {
    $rss = simplexml_load_file($url);
    $elements = array('title'=>'title', 'link'=>'link',
        'pubDate'=>'date', 'description'=>'description');
    $feed = array();
    foreach ($rss->channel as $channel) {
        $feed[] = RSS_Tags($channel, $elements, 0);
        foreach ($channel->item as $item) {
            $feed[] = RSS_Tags($item, $elements, 1);
        }
    }
    return $feed;
}

$url = 'http://www.ryanhache.com/feed';
$RSS_Content = RSS_Retrieve($url);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...