2009-07-29 8 views
26

Comment imprimer un fichier xml à l'écran en php?Comment echo fichier xml en php

Ce ne fonctionne pas:

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

Y at-il une solution simple? Peut-être sans SimpleXML?

+1

XML est un format basé sur des chaînes. SimpleXML convertit XML en objets PHP pour une manipulation plus facile en PHP. Si vous voulez afficher du XML, faites simplement écho à la chaîne XML, et comme mentionné, n'oubliez pas d'ajouter les bons en-têtes de réponse HTTP. C'est ce qui indique au client HTTP de traiter le fichier en tant que fichier XML. – bucabay

Répondre

49

Vous pouvez utiliser les URL HTTP comme si elles étaient des fichiers locaux, grâce à PHP's wrappers

Vous pouvez obtenir le contenu à partir d'une URL via file_get_contents(), puis l'écho, ou même lire directement en utilisant readfile()

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

ou

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

ne pas oublier de définir le type MIME correct avant outputing quoi que ce soit, cependant.

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

Pour faire écho le contenu XML dans un fichier HTML, je dois utiliser 'echo htmlentities ($ file)' afin d'afficher le XML brut (tags et contenu). Y a-t-il un meilleur moyen? – AnAurelian

4

Est-ce que je simplifie trop?

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

Certains endroits (comme digg.com) ne vous permettra pas d'accéder à leur site sans avoir un agent utilisateur, dans ce cas, vous devez régler cela avec ini_set() avant d'exécuter les file_get_contents ().

+0

cela fonctionne, mais échoue sur * certains * malarky CDATA. –

5

Vous pouvez utiliser le asXML méthode

echo $xml->asXML(); 

Vous pouvez également donner un nom de fichier

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

Est-ce que cela ajoute l'en-tête? 'header ('Content-type: text/xml');' – EndermanAPM

4

Si vous voulez juste imprimer le XML brut vous n'avez pas besoin XML simple. J'ai ajouté une gestion des erreurs et un exemple simple de la façon dont vous pourriez vouloir utiliser 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

est ici ce qui a fonctionné pour moi:

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

L'utilisation htmlspecialchars empêchera les balises d'être affiché comme html et ne rien casser. Notez que j'utilise Prettyprint pour mettre en évidence le code;)

3

Cela a fonctionné pour moi:

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

Confirmant que cela a fonctionné sur un très grand document XML. – cartalot

3

Pour afficher le code html/xml "tel quel" (à savoirtoutes les entités et éléments), échapper à tout simplement les personnages <, & et enclore le résultat avec < pré >:

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

Imprime:

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

testé sur Chrome 45

+0

Utilisé ceci et cela a fonctionné très bien pour moi. +1 –

+0

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

0

Si quelqu'un cible Yahoo flux rss peut bénéficier de cet extrait

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

Vous pouvez exécuter dans votre navigateur d'abord pour voir ce qui est là et avant le bouclage et le style en assez simple

Pour saisir la première description de l'article

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

You can see a demo here