2009-07-29 12 views
26

Come stampare un file xml sullo schermo in php?Come echo file xml in php

questo non sta funzionando:

$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; 

C'è una soluzione semplice? Forse senza SimpleXML?

+1

XML è un formato basato stringa. SimpleXML converte oggetti XML in PHP per una più facile manipolazione in PHP. Se si desidera visualizzare XML, basta echo la stringa XML e, come detto, non dimenticare di aggiungere le intestazioni di risposta HTTP corrette. Questo è ciò che indica al client HTTP di trattare il file come un file XML. – bucabay

risposta

49

È possibile utilizzare gli URL HTTP come se fossero dei file locali, grazie alla PHP's wrappers

È possibile ottenere il contenuto da un URL via file_get_contents() e then echo esso, o anche leggere direttamente tramite readfile()

$file = file_get_contents('http://example.com/rss'); 
echo $file; 

o

readfile('http://example.com/rss'); 

non dimenticare di impostare il tipo MIME corretto prima outputing nulla, però.

header('Content-type: text/xml'); 
+0

Per riprodurre i contenuti XML all'interno di un file HTML, devo usare 'echo htmlentities ($ file)' per visualizzare l'XML non elaborato (tag e contenuto). C'è un modo migliore? – AnAurelian

4

Sto semplificando eccessivamente questo?

$location = "http://rss.news.yahoo.com/rss/topstories"; 
print file_get_contents($location); 

Alcuni luoghi (come digg.com) non vi permetterà di accedere loro sito senza avere un user-agent, nel qual caso si avrebbe bisogno di impostare che con ini_set() prima di eseguire il file_get_contents ().

+0

funziona, ma fallisce in * alcuni * CDATA malarky. –

5

È possibile utilizzare il metodo diasXml

echo $xml->asXML(); 

Si può anche dare un nome di file

$xml->asXML('filename.xml'); 
+0

Questo aggiunge l'intestazione? 'header ('Content-type: text/xml');' – EndermanAPM

4

Se si desidera solo per stampare il codice XML grezzo che non è necessario XML semplice. Ho aggiunto alcuni errori di gestione e un semplice esempio di come potresti voler utilizzare 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; 
} 
11

Ecco cosa ha funzionato per me:

<pre class="prettyprint linenums"> 
    <code class="language-xml"><?php echo htmlspecialchars(file_get_contents("example.xml"), ENT_QUOTES); ?></code> 
</pre> 

Utilizzando htmlspecialchars impedirà tag venga visualizzato come HTML e non rompere nulla. Si noti che sto usando Prettyprint per evidenziare il codice;)

3

Questo ha funzionato per me:

echo(header('content-type: text/xml')); 
+0

La conferma ha funzionato su un documento xml molto grande. – cartalot

3

Per visualizzare il codice HTML/xml "così come sono" (vale a diretutte le entità e gli elementi), semplicemente sfuggire i personaggi <, &, e allegare il risultato con <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>'; 

Prints:

<?xml version="1.0" encoding="UTF-8"?> 
<root> 
    <foo>ó</foo> 
    <bar>&#xF3;</bar> 
</root> 

Testato su Chrome 45

+0

Utilizzato questo e ha funzionato benissimo per me. +1 –

+0

$ XML = str_replace ('>', '>', $ XML); –

0

Se qualcuno si rivolge mangime yahoo rss può beneficiare di questo frammento

<?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); 
?> 

Si consiglia di eseguirlo nel browser prima di vedere ciò che c'è e prima di loop e lo stile in su abbastanza semplice

Per afferrare la prima descrizione

<?php 
    echo($featureRss['channel']['item'][0]['description']); 
?> 

You can see a demo here