Итак, я создаю страницу для сайта подкаста друга, в которой перечислены все эпизоды для его подкастов. По сути, все, что я ищу, – это прочитать RSS-канал. Разберите узлы и отобразите информацию на экране. (в конце концов, я собираюсь создать игрока, который будет играть в эпизоды, но это намного позже)
Вот как я читаю RSS-канал (который находится на одном из моих шоу – для целей тестирования).
нажмите, чтобы увидеть мою фид
<?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(' & ', ' & ', $feed[$x]['title']); $link = $feed[$x]['link']; $description = $feed[$x]['desc']; $short = substr($description, 0, strpos( $description, '<')); $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
чтобы я мог отображать его на странице с остальной информацией (это будет полезно, когда я сделаю плеер – в итоге).
ТАК! Как получить атрибут url
из узла enclosure
? Неужели я все это делаю неправильно?
Любые полезные подсказки будут оценены. Благодарю.
Узлы имеют метод 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, результатом является только пустая строка и не запускается ошибка.
Вы также можете напрямую извлекать атрибуты. Подобно атрибуту url элемента оболочки:
echo 'Enclosure Url: ', $xpath->evaluate('string(enclosure/@url)', $rssItem), "\n";
Извиняюсь, если вы решили использовать 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++ ) ?>