Comment générer dynamiquement un fichier XML en utilisant PHP?

233

Je dois générer un fichier xml dynamiquement lors de l'exécution. Aidez-moi à générer dynamiquement le fichier XML ci-dessous à l'aide de 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
la source
1
Aussi remebmber, xml 1.0 n'est pas pris en charge par tous les moteurs de recherche. Je vous recommande xml 0.9 car c'est la version xml la plus connue!
Domuta Marcel
Générer un fichier XML en utilisant PHP et MySQL - kvcodes.com/2017/03/generate-xml-file-using-php-mysql
Kvvaradha
1
@Kvvaradha ce n'est pas une bonne solution
robertmain

Réponses:

358

J'utiliserais 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());
Ivan Krechetov
la source
12
Il est possible de spécifier l'encodage avec SimpleXml? Comment cela peut-il être fait?
Eineki
1
Salut, j'ai essayé votre exemple, mais dans la validation, je reçois 2 avertissements.Comment les effacer? validator.w3.org/…
Satya
3
@Eineki vient d'ajouter l' <?xml version="1.0" encoding="WHATEVER_IT_IS"?>instruction de traitement. Je crois que SimpleXMLElement fera la bonne chose: convertir toutes les valeurs de chaîne interrogées en votre mb_internal_encoding.
Ivan Krechetov
33
$xml = new SimpleXMLElement("<?xml version=\"1.0\" encoding=\"utf-8\" ?><Person></Person>");
kebyang
J'obtiens «erreur à la ligne 2 de la colonne 6: déclaration XML autorisée uniquement au début du document»; le code ajoute une ligne vide supplémentaire au début du xml, ce qui provoque une erreur d'analyse.
Elia Weiss
179

Pour créer un document XML en PHP, vous devez créer une classe DOMDocument, créer des nœuds enfants et ajouter ces nœuds dans la branche correcte de l'arborescence des documents.

Pour référence, vous pouvez lire http://it.php.net/manual/en/book.dom.php

Nous allons maintenant faire un tour rapide du code ci-dessous.

  • à la ligne 2, nous créons un document xml vide (spécifiez simplement la version xml (1.0) et l'encodage (utf8))
  • nous devons maintenant remplir l'arborescence xml:
    • Nous devons créer un xmlnode (ligne 5)
    • et nous devons l'ajouter dans la bonne position. Nous créons la racine, nous l’ajoutons donc directement au domdocument.
    • Remarque: créer un élément ajouter l'élément au nœud et renvoyer le nœud inséré, nous enregistrons cette référence pour ajouter les nœuds de piste au nœud racine (appelé accessoirement xml).

Ce sont les bases, vous pouvez créer et ajouter un nœud en une seule ligne (13e, par exemple), vous pouvez faire beaucoup d'autres choses avec l'api dom. C'est comme tu veux.

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

Edit: juste un autre indice: le principal avantage d'utiliser un xmldocument (celui du document dom ou celui du simplexml) au lieu d'imprimer le xml, est que le xmltree est consultable avec la requête xpath

Eineki
la source
6
puis-je utiliser à nouveau $domtree->save('mypath/xmlfile.xml');?
guitarlass
1
@guitarlass Vous avez raison. save et saveXML sont similaires: la première sauvegarde le xmltree dans un fichier, la seconde dans une chaîne (et vous pouvez l'enregistrer dans une étape suivante avec les directives normales d'enregistrement de fichier).
Eineki
4
@jjonesdesign Vous devez travailler dur pour obtenir les connaissances nécessaires pour être paresseux :)
Eineki
1
L'exemple génère une longue ligne au lieu de rompre par des éléments XML. Vous devez ajouter $domtree->formatOutput = true;pour rendre la sortie jolie :)
JackTheKnife
1
@Drenyl ajoutez un en-tête de type de contenu approprié et un Content-Disposition: attachmentet imprimez le résultat saveXml. Vous pouvez également suggérer un nom de fichier.
Eineki
27

Une manière facilement cassée de le faire est:

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

?>

enregistrez-le sous .php

andyk
la source
18
facile, mais sujet à des erreurs lors de l'interpolation de variables contenant des métacaractères XML, telles que les crochets angulaires et les esperluettes
Matthew Lock
15

Avec FluidXML, vous pouvez générer votre XML très facilement.

$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
la source
2
FluidXML dans la dernière version prend en charge PHP 5 .
Daniele Orlando
4
Une bibliothèque externe pour faire quelque chose qui peut facilement être fait en PHP natif avec SimpleXML n'est pas la solution.
robertmain
4

Jetez un œil au système de modèles Tiny But Strong . Il est généralement utilisé pour les modèles HTML, mais il existe une extension qui fonctionne avec les fichiers XML. J'utilise beaucoup cela pour créer des rapports où je peux avoir un fichier de code et deux fichiers de modèle - htm et xml - et l'utilisateur peut alors choisir d'envoyer un rapport à l'écran ou à une feuille de calcul.

Un autre avantage est que vous n'avez pas à coder le xml à partir de zéro, dans certains cas, je souhaitais exporter de très grandes feuilles de calcul complexes, et au lieu d'avoir à coder toute l'exportation, tout ce qui est nécessaire est d'enregistrer une feuille de calcul existante dans xml et remplacer dans les balises de code où la sortie de données est requise. C'est une façon rapide et très efficace de travailler.

Cruachan
la source
-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");

Il suffit de se connecter à votre base de données, il créera un fichier test.xml dans votre dossier de projet

pratik
la source
26
C'est le genre de code qui ne devrait jamais voir le jour. Selon les données que vous sortez, vous pouvez créer un XML non valide (c'est-à-dire non analysable). C'est au mieux bâclé, et même si cela peut sembler facile car vous pouvez enregistrer quelques lignes de code, cela vous coûtera plus tard en termes de maintenance et de débogage; sans parler du pauvre type qui pourrait un jour prendre la responsabilité de votre travail.
Arne
3
-1 D'abord en concanant une chaîne avec du wanna-be-xml, puis en poussant cette chaîne dans SimpleXML - Cela semble simplement inversé. Au lieu de cela, initialisez d' abord l'objet de bibliothèque XML, puis utilisez-le pour créer le XML. C'est plus facile, utilise moins de mémoire, est moins sujet aux erreurs et vous permet de diffuser le XML vers un fichier ou une sortie standard.
hakre
2
Il est peut-être temps de supprimer cette réponse (et vous récupérerez votre réputation perdue!).
Jose Manuel Abarca Rodríguez
Je pense que ça devrait rester. J'ai créé du code moi-même pour la première fois en travaillant avec XML et cela ressemblait un peu à ceci, donc c'était très utile de voir ce qu'il ne fallait PAS faire.
Peter Højlund Andersen