Как echo xml-файл в php

Как распечатать 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>&#xF3;</bar> </root>'; $XML = str_replace('&', '&amp;', $XML); $XML = str_replace('<', '&lt;', $XML); echo '<pre>' . $XML . '</pre>'; 

Печать:

 <?xml version="1.0" encoding="UTF-8"?> <root> <foo>ó</foo> <bar>&#xF3;</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("&nbsp;"); /*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']); ?> 

Вы можете увидеть демо здесь