Как распечатать xml-файл на экране в php?
Это не работает:
$curl = curl_init(); curl_setopt ($curl, CURLOPT_URL, 'http://rss.news.yahoo.com/rss/topstories'); curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); $result = curl_exec ($curl); curl_close ($curl); $xml = simplexml_load_string($result); echo $xml;
Есть ли простое решение? Может быть, без SimpleXML?
Вы можете использовать URL-адреса HTTP, как если бы они были локальными файлами, благодаря фреймворкам PHP
Вы можете получить содержимое с URL-адреса через file_get_contents (), а затем повторить его или даже прочитать непосредственно с помощью файла readfile ()
$file = file_get_contents('http://example.com/rss'); echo $file;
или
readfile('http://example.com/rss');
Однако не забудьте установить правильный тип MIME, прежде чем выводить что-либо.
header('Content-type: text/xml');
Вот что сработало для меня:
<pre class="prettyprint linenums"> <code class="language-xml"><?php echo htmlspecialchars(file_get_contents("example.xml"), ENT_QUOTES); ?></code> </pre>
Использование htmlspecialchars предотвратит отображение тегов как html и ничего не сломает. Обратите внимание, что я использую Prettyprint для выделения кода;)
Вы можете использовать метод asXML
echo $xml->asXML();
Вы также можете указать имя файла
$xml->asXML('filename.xml');
Я упрощаю это?
$location = "http://rss.news.yahoo.com/rss/topstories"; print file_get_contents($location);
Некоторые места (например, digg.com) не позволят вам получить доступ к их сайту без использования пользовательского агента, и в этом случае вам нужно будет установить это с помощью ini_set () перед запуском file_get_contents ().
Если вы хотите распечатать необработанный XML, вам не нужен Simple XML. Я добавил некоторые обработки ошибок и простой пример того, как вы можете использовать SimpleXML.
<?php $curl = curl_init(); curl_setopt ($curl, CURLOPT_URL, 'http://rss.news.yahoo.com/rss/topstories'); curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); $result = curl_exec ($curl); if ($result === false) { die('Error fetching data: ' . curl_error($curl)); } curl_close ($curl); //we can at this point echo the XML if you want //echo $result; //parse xml string into SimpleXML objects $xml = simplexml_load_string($result); if ($xml === false) { die('Error parsing XML'); } //now we can loop through the xml structure foreach ($xml->channel->item as $item) { print $item->title; }
Это сработало для меня:
echo(header('content-type: text/xml'));
Чтобы отобразить html / xml «как есть» (т. Е. Все сущности и элементы), просто выйдите из символов < , & и приложите результат с помощью <pre> :
$XML = '<?xml version="1.0" encoding="UTF-8"?> <root> <foo>ó</foo> <bar>ó</bar> </root>'; $XML = str_replace('&', '&', $XML); $XML = str_replace('<', '<', $XML); echo '<pre>' . $XML . '</pre>';
Печать:
<?xml version="1.0" encoding="UTF-8"?> <root> <foo>ó</foo> <bar>ó</bar> </root>
Протестировано на Chrome 45
Если кто-то нацелен на yahoo rss-канал, может извлечь выгоду из этого фрагмента
<?php $rssUrl="http://news.yahoo.com/rss/topstories"; //==================================================== $xml=simplexml_load_file($rssUrl) or die("Error: Cannot create object"); //==================================================== $featureRss = array_slice(json_decode(json_encode((array) $xml ), true ), 0 ); /*Just to see what is in it use this function PrettyPrintArray() instead of var_dump($featureRss);*/ function PrettyPrintArray($rssData, $level) { foreach($rssData as $key => $Items) { for($i = 0; $i < $level; $i++) echo(" "); /*if content more than one*/ if(!is_array($Items)){ //$Items=htmlentities($Items); $Items=htmlspecialchars($Items); echo("Item " .$key . " => " . $Items . "<br/><br/>"); } else { echo($key . " => <br/><br/>"); PrettyPrintArray($Items, $level+1); } } } PrettyPrintArray($featureRss, 0); ?>
Вы можете сначала запустить его в своем браузере, чтобы увидеть, что есть, и перед тем, как зациклиться и создать его довольно просто.
Чтобы получить первое описание элемента
<?php echo($featureRss['channel']['item'][0]['description']); ?>
Вы можете увидеть демо здесь