webentwicklung-frage-antwort-db.com.de

Wie man eine XML-Datei in php

Wie drucke ich eine XML-Datei in php auf den Bildschirm?

Das funktioniert nicht:

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

Gibt es eine einfache Lösung? Vielleicht ohne SimpleXML?

32
chris

Sie können HTTP-URLs als lokale Dateien verwenden, dank der Wrapper von PHP

Sie können den Inhalt von einer URL über file_get_contents () abrufen und dann wiederholen oder sogar direkt mit readfile () lesen

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

oder

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

Vergessen Sie nicht, den richtigen MIME-Typ einzustellen, bevor Sie etwas ausgeben.

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

Folgendes hat für mich funktioniert:

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

Die Verwendung von htmlspecialchars verhindert, dass Tags als html angezeigt werden, und zerstört nichts. Beachten Sie, dass ich Prettyprint benutze, um den Code hervorzuheben;)

14
GabLeRoux

Sie können die Methode asXML verwenden

echo $xml->asXML();

Sie können ihm auch einen Dateinamen geben

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

Bin ich das zu stark vereinfacht?

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

Einige Orte (wie digg.com) erlauben Ihnen nicht, ohne einen Benutzeragenten auf ihre Website zuzugreifen. In diesem Fall müssen Sie dies mit ini_set () festlegen, bevor Sie file_get_contents () ausführen.

4
Sampson

Um die HTML/XML-Datei "wie sie ist" (d. H. Alle Entitäten und Elemente) anzuzeigen, können Sie die Zeichen <, & umleiten und das Ergebnis mit <pre> einschließen:

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

Drucke:

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

Getestet auf Chrome 45

4
mikl

Wenn Sie nur das rohe XML drucken möchten, benötigen Sie kein einfaches XML. Ich habe einige Fehlerbehandlung hinzugefügt und ein einfaches Beispiel dafür, wie Sie SimpleXML verwenden möchten.

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

Das hat für mich funktioniert:

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

Wenn jemand auf Yahoo-RSS-Feeds abzielt, kann dies von diesem Snippet profitieren 

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

Vielleicht möchten Sie es zuerst in Ihrem Browser ausführen, um zu sehen, was dort ist, und bevor Sie das Looping durchführen und es ziemlich einfach gestalten 

Um die erste Artikelbeschreibung zu ergreifen

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

Sie können eine Demo hier sehen

0
ShapCyber

Das funktioniert:

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

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