PHP阅读XML播客RSS Feed

时间:2014-04-01 21:14:25

标签: php xml rss

好的,所以,我正在为朋友的播客网站创建一个页面,列出他的播客的所有剧集。基本上,我正在寻找的是如何阅读RSS Feed。解析节点,并在屏幕上显示信息。 (最终,我将创建一个播放剧集的播放器,但那要晚得多)

这就是我正在阅读RSS Feed的方式(这是我的一个节目 - 用于测试目的)。

点击查看My Feed

<?php

    //Errors:
    ini_set('display_errors', 'On');
    error_reporting(E_ALL);

    $rss = new DOMDocument();
    $rss->load('http://tbpc.podbean.com/feed/');
    $feed = array();
    foreach ($rss->getElementsByTagName('item') as $node) {
        $item = array ( 
            'title' => $node->getElementsByTagName('title')->item(0)->nodeValue,
            'link' => $node->getElementsByTagName('link')->item(0)->nodeValue,
            'desc' => $node->getElementsByTagName('description')->item(0)->nodeValue,
            'guid' => $node->getElementsByTagName('guid')->item(0)->nodeValue,
            'enclosure' => $node->getElementsByTagName('enclosure')->item(0)->nodeValue,
            );
        array_push($feed, $item);
    }
    $limit = 1;
    for($x=0;$x<$limit;$x++) {
        $title = str_replace(' & ', ' &amp; ', $feed[$x]['title']);
        $link = $feed[$x]['link'];
        $description = $feed[$x]['desc'];
        $short =  substr($description, 0, strpos( $description, '&lt;'));
        $file = $feed[$x]['guid'];
        echo '<p><strong><a href="'.$link.'" title="'.$title.'">'.$title.'</a></strong></p>';
        echo '<p>'.$description.'</p>';
        echo '<p>'.$short.'</p>';
        echo '<p>'.$file.'</p>';
    }
?>

问题是 - 是我不知道如何从url节点的属性enclosure中获取信息,以便我可以在页面上显示其余的信息(当我制作播放器时,这将派上用场 - 最终)。

SO!如何从url节点获取enclosure属性?我是不是错了?

任何有用的提示将不胜感激。感谢。

2 个答案:

答案 0 :(得分:2)

如果你决定在这里使用DOMDocument(),请道歉,但是因为到目前为止还没有人发布过答案...这里是一个使用simple_xml_load_file()的脚本,我发现很容易得到要掌握。

    <?php

        $rss_array = array('http://rss.computerworld.com/computerworld/s/feed/topic/231', 'http://rss.computerworld.com/computerworld/s/feed/topic/230', 'http://rss.computerworld.com/computerworld/s/feed/topic/66', 'http://www.engadget.com/rss.xml', 'http://feeds.webservice.techradar.com/rss/new', 'http://feeds.arstechnica.com/arstechnica/index', 'http://www.notebookcheck.net/News.152.100.html', 'http://electronista.feedsportal.com/c/34342/f/626172/index.rss', 'http://www.anandtech.com/rss/pipeline/', 'http://www.digitimes.com/rss/daily.xml', 'http://feeds.feedburner.com/TechCrunch/', 'http://feeds2.feedburner.com/ziffdavis/pcmag/breakingnews', 'http://feeds.feedburner.com/Liliputing', 'http://feeds.slashgear.com/slashgear', 'http://feeds.feedburner.com/GizmagEmergingTechnologyMagazine', 'http://www.zdnet.com/news/rss.xml', 'http://feeds.feedburner.com/mobilityupdate', 'http://www.techmeme.com/feed.xml', 'http://www.notebookreview.com/rss.xml'); 

    for ($i=0; $i<count($rss_array); $i++ ) {
                $rssfeed = simplexml_load_file($rss_array[$i]);
                foreach ($rssfeed->channel as $channel) {

                    echo '<h1>' . htmlentities($channel->title) . '</h1>';
                    echo '<p>' . htmlentities($channel->description) . '</p>';
                    echo '<p><a href="' . htmlentities($channel->link) . '">' .
                        htmlentities($channel->link) . '</a></p>';

                    echo '<input type="button" value="  >>>  " onClick="downloadFileViaAjax(\'' . htmlentities($channel->link) . '\')">';     



                    echo '<ul>';
                    foreach ($channel->item as $item) {
                        echo '<li><a href="' . htmlentities($item->link) . '">';
                        echo htmlentities($item->title) . '</a>';
                    //  echo htmlentities($item->description) . '</li>';
                        echo '<input type="button" value="  >>>  " onClick="downloadFileViaAjax(\'' . htmlentities($item->link) . '\')"></li>';   

                    }
                    echo '</ul>';
                }
    }//fur ( $rss_array++    )






    ?>

答案 1 :(得分:1)

节点有getAttribute()方法。所以你可以使用:

$node->getElementsByTagName('enclosure')->item(0)->getAttribute('url')

但是这是从XML DOM获取节点和值的另一种更舒适的方法:使用Xpath。请参阅此答案:https://stackoverflow.com/a/20225186/2265374

如果没有找到任何元素,$node->getElementsByTagName('enclosure')->item(0)将导致错误(SimpleXML btw 也是如此)。如果节点列表在Xpath中强制转换为字符串,则结果只是一个空字符串,并且不会触发错误。

您也可以通过这种方式直接获取属性。与enclosure元素的url属性类似:

echo 'Enclosure Url: ', $xpath->evaluate('string(enclosure/@url)', $rssItem), "\n";