2009-07-29 18 views
26

Jak wydrukować plik xml na ekranie w php?Jak echo pliku xml w php

To nie działa:

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

Czy istnieje proste rozwiązanie? Może bez SimpleXML?

+1

formacie XML jest oparty ciągiem. SimpleXML konwertuje XML na obiekty PHP dla łatwiejszej manipulacji w PHP. Jeśli chcesz wyświetlić XML, po prostu echo łańcucha XML, i jak wspomniano, nie zapomnij dodać prawidłowe nagłówki odpowiedzi HTTP. To właśnie instruuje klienta HTTP, aby traktował plik jako plik XML. – bucabay

Odpowiedz

49

można używać adresów HTTP, tak jakby były one lokalne pliki, dzięki PHP's wrappers

można uzyskać zawartość z adresu URL za pośrednictwem file_get_contents(), a następnie powtórzyć to, a nawet czytać go bezpośrednio za pomocą ReadFile()

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

lub

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

nie zapomnij, aby ustawić odpowiedni typ MIME przed outputing niczego, choć.

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

Aby wyświetlić zawartość XML w pliku HTML, muszę użyć 'echo htmlentities ($ file)' , aby wyświetlić surowy XML (znaczniki i zawartość). Czy istnieje lepszy sposób? – AnAurelian

4

Czy upraszczam to?

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

Niektóre miejsca (jak digg.com) nie pozwoli na dostęp do ich strony, bez konieczności User-agent, w takim przypadku trzeba by było ustawić, że z ini_set() przed uruchomieniem (file_get_contents).

+0

to działa, ale kończy się niepowodzeniem * trochę * malarka CDATA. –

5

Można użyć asXML metodę

echo $xml->asXML(); 

Można również nadać mu nazwę pliku

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

Czy to doda nagłówek? 'header (" Content-type: text/xml '); ' – EndermanAPM

4

Jeśli chcesz po prostu wydrukować surowego XML nie trzeba Prosty XML. Dodałem obsługę błędów i prosty przykład tego, jak możesz użyć 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

Oto co pracował dla mnie:

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

Korzystanie htmlspecialchars uniemożliwi znaczniki, które są wyświetlane jako html i nic nie złamie. Należy zauważyć, że używam Prettyprint aby podświetlić kodu;)

3

Ten pracował dla mnie:

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

Potwierdzenie tego działało na bardzo dużym dokumencie xml. – cartalot

3

Aby wyświetlić html/xml „jak jest” (tjwszystkie podmioty i elementy), po prostu uciec znaków <, & i załączyć wynik z <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>'; 

reprodukcje:

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

Testowane na Chrome 45

+0

Użyłem tego i zadziałało dobrze. +1 –

+0

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

0

Jeśli ktoś jest kierowana feed yahoo rss mogą korzystać z tego fragmentu

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

Można go uruchomić w przeglądarce najpierw zobaczyć, co tam jest i przed zapętlenie i styl go całkiem proste

Aby chwycić pierwszy opis przedmiotu

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

You can see a demo here