web-dev-qa-db-fra.com

Comment echo fichier xml en php

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

Cela 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-a-t-il une solution simple? Peut-être sans SimpleXML?

32
chris

Vous pouvez utiliser les URL HTTP comme s'il s'agissait de fichiers locaux, grâce à les wrappers de PHP

Vous pouvez obtenir le contenu d'une URL via file_get_contents () et ensuite l'échanger ou même le lire directement avec readfile ()

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

ou

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

N'oubliez pas de définir le type MIME correct avant de générer quoi que ce soit.

header('Content-type: text/xml');
58
Josh Davis

Voici 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>

Utiliser htmlspecialchars empêchera les balises de s’afficher en tant que html et ne cassera rien. Notez que j'utilise Prettyprint pour mettre le code en surbrillance;)

14
GabLeRoux

Vous pouvez utiliser la méthode asXML

echo $xml->asXML();

Vous pouvez aussi lui donner un nom de fichier

$xml->asXML('filename.xml');
5
Cristian Toma

Suis-je trop simplifier cela?

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

Certains endroits (comme digg.com) ne vous autoriseront pas à accéder à leur site sans agent utilisateur. Dans ce cas, vous devrez le définir avec ini_set () avant d'exécuter file_get_contents ().

4
Sampson

Pour afficher le code html/xml "tel quel" (c'est-à-dire toutes les entités et tous les éléments), échappez simplement les caractères <, & et mettez le résultat entre <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>';

Impressions:

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

Testé sur Chrome 45

4
mikl

Si vous voulez simplement imprimer le XML brut, vous n'avez pas besoin de XML simple. J'ai ajouté quelques erreurs de traitement et un exemple simple de la façon dont vous pourriez 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;   
}
4
Tom Haigh

Cela a fonctionné pour moi:

echo(header('content-type: text/xml'));
3
jim

Si quelqu'un cible yahoo rss feed 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 voudrez peut-être d'abord l'exécuter dans votre navigateur pour voir ce qu'il y a avant de le mettre en boucle et le styliser assez facilement 

Pour saisir la première description de l'article

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

Vous pouvez voir une démo ici

0
ShapCyber

Cela marche:

<?php
$XML = "<?xml version='1.0' encoding='UTF-8'?>
<!-- Your XML -->
";

header('Content-Type: application/xml; charset=utf-8');
echo ($XML);
?>
0
Malvoz