2009-07-29 71 views
26

¿Cómo imprimir un archivo xml en la pantalla en php?Cómo hacer eco de un archivo xml en php

Esto no está funcionando:

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

¿Hay una solución simple? Tal vez sin SimpleXML?

+1

XML es un formato basado en cadena. SimpleXML convierte objetos XML a PHP para facilitar la manipulación en PHP. Si desea mostrar XML, simplemente haga eco de la cadena XML, y como se mencionó, no olvide agregar los Encabezados de respuesta HTTP correctos. Esto es lo que instruye al cliente HTTP para tratar el archivo como un archivo XML. – bucabay

Respuesta

49

Puede utilizar las direcciones URL HTTP como si fueran archivos locales, gracias a PHP's wrappers

Puede obtener el contenido de una URL a través de file_get_contents() y luego echo, o incluso leer directamente usando readfile()

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

o

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

no se olvide de establecer el tipo MIME correcto antes de imprimirla nada, sin embargo.

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

Para hacer eco de los contenidos XML dentro de un archivo HTML, tengo que usar 'echo htmlentities ($ file)' para mostrar el XML sin formato (etiquetas y contenido). ¿Hay una mejor manera? – AnAurelian

4

¿Estoy simplificando demasiado esto?

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

En algunos lugares (como digg.com) no le permitirá acceder a su sitio sin tener un agente de usuario, en cuyo caso se tendría que establecer que con ini_set() antes de ejecutar el file_get_contents ()

+0

esto funciona, pero falla en * algunos * CDATA malarky. –

5

Puede utilizar el método asXML

echo $xml->asXML(); 

También puede darle un nombre de archivo

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

¿Esto agrega el encabezado? 'header ('Content-type: text/xml');' – EndermanAPM

4

Si lo que desea es imprimir el código XML sin procesar que no es necesario Simple XML. Agregué un manejo de errores y un ejemplo simple de cómo podría querer usar 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

Esto es lo que funcionó para mí:

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

Usando htmlspecialchars impedirá que las etiquetas se muestren como html y no romper nada. Tenga en cuenta que estoy usando Prettyprint para resaltar el código;)

3

Esto funcionó para mí:

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

Confirmando esto funcionó en un documento xml muy grande. – cartalot

3

Para mostrar el html/xml "tal cual" (es decir,todas las entidades y elementos), simplemente escapar de los caracteres <, &, y encierran el resultado 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> 

probado en Chrome 45

+0

Usé esto y me funcionó muy bien. +1 –

+0

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

0

Si alguien se dirige a la alimentación Yahoo RSS puede beneficiarse de este fragmento

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

Es posible que desee ejecutar en el navegador primero para ver lo que está allí y antes de bucle y el estilo que hasta bastante simple

Para agarrar la primera descripción del artículo

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

You can see a demo here

Cuestiones relacionadas