Wie generiere ich XML-Dateien dynamisch mit PHP?

232

Ich muss zur Laufzeit dynamisch eine XML-Datei generieren. Bitte helfen Sie mir bei der dynamischen Generierung der folgenden XML-Datei mit PHP.

<?xml version="1.0" encoding="UTF-8"?>
<xml>
 <track>
     <path>song1.mp3</path>
     <title>Track 1 - Track Title</title>
 </track>
 <track>
     <path>song2.mp3</path>
     <title>Track 2 - Track Title</title>
 </track>
 <track>
     <path>song3.mp3</path>
     <title>Track 3 - Track Title</title>
 </track>
 <track>
     <path>song4.mp3</path>
     <title>Track 4 - Track Title</title>
 </track>
 <track>
     <path>song5.mp3</path>
     <title>Track 5 - Track Title</title>
 </track>
 <track>
     <path>song6.mp3</path>
     <title>Track 6 - Track Title</title>
 </track>
 <track>
     <path>song7.mp3</path>
     <title>Track 7 - Track Title</title>
 </track>
 <track>
     <path>song8.mp3</path>
     <title>Track 8 - Track Title</title>
 </track>

musicking123
quelle
1
Auch remebmber, xml 1.0 wird nicht von allen Suchmaschinen unterstützt. Ich empfehle Ihnen XML 0.9, weil es die bekannteste XML-Version ist!
Domuta Marcel
Generieren Sie eine XML-Datei mit PHP und MySQL - kvcodes.com/2017/03/generate-xml-file-using-php-mysql
Kvvaradha
1
@ Kvvaradha, das ist keine gute Lösung
Robertmain

Antworten:

358

Ich würde SimpleXMLElement verwenden .

<?php

$xml = new SimpleXMLElement('<xml/>');

for ($i = 1; $i <= 8; ++$i) {
    $track = $xml->addChild('track');
    $track->addChild('path', "song$i.mp3");
    $track->addChild('title', "Track $i - Track Title");
}

Header('Content-type: text/xml');
print($xml->asXML());
Ivan Krechetov
quelle
12
Ist es möglich, die Codierung mit SimpleXml anzugeben? Wie geht das?
Eineki
1
Hallo, ich habe dein Beispiel ausprobiert, aber bei der Validierung erhalte ich 2 Warnungen. Wie lösche ich sie? validator.w3.org/…
Satya
3
@Eineki einfach die <?xml version="1.0" encoding="WHATEVER_IT_IS"?>Verarbeitungsanweisung hinzufügen . Ich glaube, SimpleXMLElement wird das Richtige tun: alle abgefragten Zeichenfolgenwerte in Ihre mb_internal_encoding konvertieren.
Ivan Krechetov
33
$xml = new SimpleXMLElement("<?xml version=\"1.0\" encoding=\"utf-8\" ?><Person></Person>");
Kebyang
Ich erhalte 'Fehler in Zeile 2 in Spalte 6: XML-Deklaration nur am Anfang des Dokuments zulässig'; Der Code fügt am Anfang der XML eine zusätzliche leere Zeile hinzu, die einen Analysefehler verursacht.
Elia Weiss
179

Um ein XML-Dokument in PHP zu erstellen, sollten Sie eine DOMDocument-Klasse instanziieren, untergeordnete Knoten erstellen und diese Knoten im richtigen Zweig des Dokumentbaums anhängen.

Als Referenz können Sie http://it.php.net/manual/en/book.dom.php lesen

Jetzt werden wir einen kurzen Rundgang durch den folgenden Code machen.

  • In Zeile 2 erstellen wir ein leeres XML-Dokument (geben Sie einfach die XML-Version (1.0) und die Codierung (utf8) an.)
  • Jetzt müssen wir den XML-Baum füllen:
    • Wir müssen einen xmlnode erstellen (Zeile 5)
    • und wir müssen dies an der richtigen Position anhängen. Wir erstellen die Wurzel, also hängen wir diese direkt an das Domdokument an.
    • Hinweis: Element erstellen Hängt das Element an den Knoten an und gibt den eingefügten Knoten zurück. Wir speichern diese Referenz, um die Spurknoten an den Wurzelknoten anzuhängen (im Übrigen als XML bezeichnet).

Dies sind die Grundlagen. Sie können einen Knoten in nur einer Zeile erstellen und anhängen (z. B. 13.). Mit der dom-API können Sie viele andere Dinge tun. Es liegt an dir.

<?php    
    /* create a dom document with encoding utf8 */
    $domtree = new DOMDocument('1.0', 'UTF-8');

    /* create the root element of the xml tree */
    $xmlRoot = $domtree->createElement("xml");
    /* append it to the document created */
    $xmlRoot = $domtree->appendChild($xmlRoot);

    $currentTrack = $domtree->createElement("track");
    $currentTrack = $xmlRoot->appendChild($currentTrack);

    /* you should enclose the following two lines in a cicle */
    $currentTrack->appendChild($domtree->createElement('path','song1.mp3'));
    $currentTrack->appendChild($domtree->createElement('title','title of song1.mp3'));

    $currentTrack->appendChild($domtree->createElement('path','song2.mp3'));
    $currentTrack->appendChild($domtree->createElement('title','title of song2.mp3'));

    /* get the xml printed */
    echo $domtree->saveXML();
?>

Bearbeiten: Nur ein weiterer Hinweis: Der Hauptvorteil der Verwendung eines xmldocument (das dom document one oder das simplexml one) anstelle des Druckens der xml besteht darin, dass der xmltree mit der xpath-Abfrage durchsucht werden kann

Eineki
quelle
6
kann ich wieder verwenden $domtree->save('mypath/xmlfile.xml');?
Gitarrenglas
1
@guitarlass Du hast recht. save und saveXML sind ähnlich: Der erste speichert den xmltree in einer Datei, der zweite in einer Zeichenfolge (und Sie können ihn in einem folgenden Schritt mit normalen Anweisungen zum Speichern von Dateien speichern).
Eineki
4
@jjonesdesign Sie müssen hart arbeiten, um das Wissen zu erhalten, das benötigt wird, um faul zu sein :)
Eineki
1
Beispiel generiert eine lange Zeile, die stattdessen durch XML-Elemente unterbrochen wird. Sie müssen hinzufügen $domtree->formatOutput = true;, um die Ausgabe hübsch zu machen :)
JackTheKnife
1
@Drenyl Fügen Sie einen entsprechenden Inhaltstyp-Header und a hinzu Content-Disposition: attachmentund drucken Sie das saveXml-Ergebnis. Sie können auch einen Dateinamen vorschlagen.
Eineki
27

Ein leicht zu brechender Weg, dies zu tun, ist:

<?php
// Send the headers
header('Content-type: text/xml');
header('Pragma: public');
header('Cache-control: private');
header('Expires: -1');
echo "<?xml version=\"1.0\" encoding=\"utf-8\"?>";

echo '<xml>';

// echo some dynamically generated content here
/*
<track>
    <path>song_path</path>
    <title>track_number - track_title</title>
</track>
*/

echo '</xml>';

?>

Speichern Sie es als .php

andyk
quelle
18
Einfach, aber fehleranfällig, wenn Variablen interpoliert werden, die XML-Metazeichen wie spitze Klammern und kaufmännisches Und enthalten
Matthew Lock
15

Mit FluidXML können Sie Ihr XML sehr einfach generieren.

$tracks = fluidxml('xml');

$tracks->times(8, function ($i) {
    $this->add([
        'track' => [
            'path'  => "song{$i}.mp3",
            'title' => "Track {$i} - Track Title"
        ]
    ]);

});

https://github.com/servo-php/fluidxml

Daniele Orlando
quelle
2
FluidXML in der letzten Version unterstützt PHP 5 .
Daniele Orlando
4
Eine externe Bibliothek, um etwas zu tun, was in nativem PHP mit SimpleXML leicht möglich ist, ist nicht die Lösung.
Robertmain
4

Schauen Sie sich das Template-System Tiny But Strong an. Es wird im Allgemeinen zum Erstellen von HTML-Vorlagen verwendet, es gibt jedoch eine Erweiterung, die mit XML-Dateien funktioniert. Ich verwende dies ausgiebig zum Erstellen von Berichten, in denen ich eine Codedatei und zwei Vorlagendateien haben kann - htm und xml - und der Benutzer kann dann wählen, ob er einen Bericht an den Bildschirm oder eine Tabelle senden möchte.

Ein weiterer Vorteil ist, dass Sie die XML nicht von Grund auf neu codieren müssen. In einigen Fällen wollte ich sehr große komplexe Tabellenkalkulationen exportieren. Statt den gesamten Export zu codieren, muss lediglich eine vorhandene Tabelle gespeichert werden XML und Ersatz in Code-Tags, bei denen eine Datenausgabe erforderlich ist. Es ist eine schnelle und sehr effiziente Art zu arbeiten.

Cruachan
quelle
-13
$query=mysql_query("select * from tablename")or die(mysql_error()); 
$xml="<libraray>\n\t\t";
while($data=mysql_fetch_array($query))
{

    $xml .="<mail_address>\n\t\t";
    $xml .= "<id>".$data['id']."</id>\n\t\t";
    $xml .= "<email>".$data['email_address']."</email>\n\t\t";
    $xml .= "<verify_code>".$data['verify']."</verify_code>\n\t\t";
    $xml .= "<status>".$data['status']."</status>\n\t\t";
    $xml.="</mail_address>\n\t";
}
$xml.="</libraray>\n\r";
$xmlobj=new SimpleXMLElement($xml);
$xmlobj->asXML("text.xml");

Es ist einfach, einfach eine Verbindung mit Ihrer Datenbank herzustellen. Die Datei test.xml wird in Ihrem Projektordner erstellt

Pratik
quelle
26
Dies ist die Art von Code, die niemals produziert werden sollte. Abhängig von den Daten, die Sie ausgeben, können Sie ungültiges (dh nicht analysierbares) XML erstellen. Es ist bestenfalls schlampig, und obwohl es einfach erscheint, weil Sie möglicherweise ein paar Codezeilen speichern, kostet es Sie später mehr in Bezug auf Wartung und Debugging. ganz zu schweigen von dem armen Kerl, der eines Tages die Verantwortung für Ihre Arbeit übernehmen könnte.
Arne
3
-1 Zuerst eine Zeichenfolge mit etwas Wanna-Be-XML konkanieren, dann diese Zeichenfolge in SimpleXML verschieben - Dies sieht einfach auf den Kopf gestellt aus. Stattdessen zuerst das Objekt XML - Bibliothek initialisieren, dann es verwenden , um die XML aufzubauen. Es ist einfacher, benötigt weniger Speicher, ist weniger fehleranfällig und ermöglicht es Ihnen, das XML in eine Datei oder ein Standardout zu streamen.
hakre
2
Vielleicht ist es Zeit, diese Antwort zu löschen (und Sie werden Ihren verlorenen Ruf zurückbekommen!).
Jose Manuel Abarca Rodríguez
Ich denke es sollte bleiben. Ich habe selbst beim ersten Arbeiten mit XML Code erstellt und es sah ein bisschen so aus. Daher war es sehr hilfreich zu sehen, was NICHT zu tun ist.
Peter Højlund Andersen