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.