Comment faire écho au 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?

29
demandé sur chris 2009-07-29 15:33:14

9 réponses

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

Vous pouvez obtenir le contenu d'une URL via file_get_contents (), puis le faire écho, ou même le lire directement en utilisant 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 sortir quoi que ce soit, cependant.

header('Content-type: text/xml');
56
répondu Josh Davis 2009-07-29 11:40:18

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>

L'utilisation de htmlspecialchars {[5] } empêchera l'affichage des balises en html et ne cassera rien. Notez que j'utilise Prettyprint pour mettre en évidence le code ;)

12
répondu GabLeRoux 2012-08-07 13:46:25

Vous pouvez utiliser la méthodeasXML

echo $xml->asXML();

Vous pouvez également lui donner un nom de fichier

$xml->asXML('filename.xml');
5
répondu Cristian Toma 2009-07-29 11:57:36

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 user-agent, auquel cas vous devrez le définir avec ini_set () avant d'exécuter file_get_contents ().

4
répondu Sampson 2009-07-29 11:39:09

Si vous voulez juste imprimer le XML brut, vous n'avez pas besoin de XML Simple. J'ai ajouté une gestion des erreurs et un exemple simple de la façon dont vous pouvez 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
répondu Tom Haigh 2009-07-29 12:14:00

Cela a fonctionné pour moi:

echo(header('content-type: text/xml'));
3
répondu jim 2015-04-22 19:12:53

Pour afficher le html / xml " tel quel "(c'est-à-dire toutes les entités et tous les éléments), il suffit d'échapper les caractères , &, et enfermez le résultat avec :

$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

3
répondu mikl 2015-09-16 14:41:27

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 l'exécuter dans votre navigateur d'abord pour voir ce qu'il y a et avant de boucler et de le styliser assez simple

Pour récupérer le premier élément description

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

Vous pouvez voir une démo ici

0
répondu ShapCyber 2016-04-18 11:08:49

Cela fonctionne:

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

header('Content-Type: application/xml; charset=utf-8');
echo ($XML);
?>
0
répondu Malvoz 2018-08-13 12:32:58