Come generare file XML in modo dinamico usando PHP?


233

Devo generare un file XML in modo dinamico in fase di esecuzione. Aiutatemi a generare dinamicamente il file XML seguente usando 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>


1
Inoltre, xml 1.0 non è supportato da tutti i motori di ricerca. Ti consiglio xml 0.9 perché è la versione xml più conosciuta!
Domuta Marcel,


1
@Kvvaradha non è una buona soluzione
robertmain,

Risposte:


358

Vorrei usare SimpleXMLElement .

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

12
È possibile specificare la codifica con SimpleXml? Come si può fare?
Eineki,

1
Ciao, ho provato il tuo esempio ma nella convalida ricevo 2 avvisi. Come cancellarli? validator.w3.org/…
Satya,

3
@Eineki aggiunge semplicemente le <?xml version="1.0" encoding="WHATEVER_IT_IS"?>istruzioni di elaborazione. Credo che SimpleXMLElement farà la cosa giusta: convertire tutti i valori di stringa interrogati nel tuo codice_mb_internal.
Ivan Krechetov,

33
$xml = new SimpleXMLElement("<?xml version=\"1.0\" encoding=\"utf-8\" ?><Person></Person>");
kebyang

Ottengo "errore nella riga 2 alla colonna 6: dichiarazione XML consentita solo all'inizio del documento"; il codice aggiunge una riga vuota all'inizio del file XML che causa l'errore di analisi.
Elia Weiss,

179

Per creare un documento XML in PHP è necessario creare un'istanza di una classe DOMDocument, creare nodi figlio e aggiungere questi nodi nel ramo corretto dell'albero del documento.

Per riferimento puoi leggere http://it.php.net/manual/en/book.dom.php

Ora faremo un breve tour del codice qui sotto.

  • alla riga 2 creiamo un documento xml vuoto (basta specificare la versione xml (1.0) e la codifica (utf8))
  • ora dobbiamo popolare l'albero xml:
    • Dobbiamo creare un xmlnode (linea 5)
    • e dobbiamo aggiungere questo nella posizione corretta. Stiamo creando la radice, quindi la aggiungiamo direttamente al documento.
    • Nota creare elemento aggiungere l'elemento al nodo e restituire il nodo inserito, salviamo questo riferimento per aggiungere i nodi della traccia al nodo radice (per inciso chiamato xml).

Queste sono le basi, puoi creare e aggiungere un nodo in una sola riga (13 °, per esempio), puoi fare molte altre cose con l'API dom. Spetta a voi.

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

Modifica: solo un altro suggerimento: il vantaggio principale di usare un xmldocument (il documento dom o quello simplexml) invece di stampare l'xml, è che l'xmltree è ricercabile con la query xpath


6
posso usare di nuovo $domtree->save('mypath/xmlfile.xml');?
Guitarlass

1
@guitarlass Hai ragione. save e saveXML sono simili: il primo scarica l'xmltree in un file, il secondo in una stringa (e puoi salvarlo in una fase successiva con le normali direttive di salvataggio dei file).
Eineki,

4
@jjonesdesign Devi lavorare sodo per ottenere le conoscenze necessarie per essere pigro :)
Eineki

1
L'esempio genera una linea lunga anziché spezzarsi da elementi XML. È necessario aggiungere $domtree->formatOutput = true;per rendere piuttosto l'uscita :)
JackTheKnife

1
@Drenyl aggiunge un'intestazione del tipo di contenuto appropriata e un Content-Disposition: attachmente stampa il risultato saveXml. Puoi anche suggerire un nome file.
Eineki,

27

Un modo semplice per farlo è:

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

?>

salvalo come .php


18
facile, ma soggetto a errori quando vengono interpolate variabili che contengono metacaratteri XML come parentesi angolari e e commerciali
Matthew Lock,

15

Con FluidXML puoi generare il tuo XML molto facilmente.

$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


2
FluidXML nell'ultima versione supporta PHP 5 .
Daniele Orlando,

4
Una libreria esterna per fare qualcosa che può essere facilmente eseguita in PHP nativo con SimpleXML non è la soluzione.
robertmain,

4

Dai un'occhiata al sistema di modelli Tiny But Strong . Viene generalmente utilizzato per il template HTML ma esiste un'estensione che funziona con i file XML. Lo uso ampiamente per creare report in cui posso avere un file di codice e due file modello - htm e xml - e l'utente può quindi scegliere se inviare un rapporto su schermo o foglio di calcolo.

Un altro vantaggio è che non è necessario codificare il codice XML da zero, in alcuni casi ho voluto esportare fogli di calcolo complessi molto grandi, e invece di dover codificare tutto l'esportazione è sufficiente salvare un foglio di calcolo esistente in XML e sostituire i tag di codice in cui è richiesto l'output di dati. È un modo rapido e molto efficiente di lavorare.


-14
$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");

È semplice connettersi semplicemente con il database per creare il file test.xml nella cartella del progetto


26
Questo è il tipo di codice che non dovrebbe mai vedere la produzione. A seconda dei dati ottenuti, è possibile creare XML non validi (ovvero non analizzabili). Nella migliore delle ipotesi è sciatto, e anche se potrebbe sembrare facile perché potresti salvare alcune righe di codice, ti costerà di più in termini di manutenzione e debug; per non parlare del povero ragazzo che un giorno potrebbe assumersi la responsabilità del tuo lavoro.
Arne,

3
-1 prima concanendo una stringa con un po 'di xml, quindi spingendo quella stringa in SimpleXML - Questo sembra appena capovolto. Invece, prima inizializza l'oggetto libreria XML, quindi usalo per creare l'XML. È più semplice, utilizza meno memoria, è meno soggetto a errori e consente di eseguire lo streaming dell'XML su file o stdout.
Hacre,

2
Forse è il momento di eliminare questa risposta (e otterrai la tua reputazione perduta!).
Jose Manuel Abarca Rodríguez,

Penso che dovrebbe rimanere. Ho creato un po 'di codice per la prima volta lavorando con XML e sembrava un po' così, quindi è stato molto utile vedere cosa NON fare.
Peter Højlund Andersen,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.