- Introduction :
Le XML (eXtensible Markup Language) ou en français "langage de balisage extensible", est un langage de balisage qui dérive de SGML. Extensible car on peut y définir différents namespaces, c'est à dire de différencier des syntaxes différentes (xHTML, RSS, XSLT...). Ce langage est rapidement devenu un standard et présente l'énorme avantage d'être utilisable avec presque tout les systèmes informatiques.
Dans notre milieux underground où nous développons des programmes "intelligents", le XML peut se révéler être un bon allier. On peut effectivement l'utiliser pour formater ses données celons nos propres règles. Il est idéal pour créer des fichiers de configurations, des enregistrer informations hiérarchiques ou échanger des flux entre systèmes.
Exemple de fichier XML :
<?xml version="1.0" encoding="utf-8"?>
<siteweb>
<mirroir pays="us">http://www.php.net</mirroir>
<mirroir pays="fr">http://fr.php.net</mirroir>
<mirroir pays="fr">http:/fr2.php.net</mirroir>
</siteweb>
- Écrire un fichier XML avec XML Writer:
XMLWriter est une extension qui permet de créer facilement des documents XML. Elle est intégrée à PHP depuis la version 5.1.2. Elle peut être utilisée en Orientée Objet ou en Procédural. Moins lourde à implémenter que le modèle DOM et elle permet de ne pas avoir à tout gérer à la main. Ce tout en assurant que le résultat final soit toujours bien formé (aucunes erreurs de syntaxe).
Il existe deux manières de créer un fichier XML. La première consiste à créer le flux XML et le mettre dans une variable. Pour cela nous utiliserons la fonction openMemory(). La seconde consiste à écrire le résultat dans fichier. Il faut alors utiliser la fonction openURI() qui demande comme argument le nom du fichier XML que l'on souhaite créer. Ensuite pour insérer des noeuds à notre arborescence XML, on peut utiliser deux méthodes. La première consiste à utiliser startElement() pour ouvrir notre noeud ; le refermer avec endElement(). La deuxième solution écrit le noeud en une seule passe avec writeElement(). Pour terminer, que l'on écrive dans la mémoire ou dans fichier, il faut toujours écrire le buffer XML avec flush().
Dans l'exemple suivant nous allons créer un fichier XML contenant l'URL des partenaires d'un site web :
<span class="syntaxhtml"><br /><span class="syntaxdefault"><?php<br /></span><span class="syntaxcomment">// On indique que l'on veut afficher un fichier XML.<br /></span><span class="syntaxdefault">header</span><span class="syntaxkeyword">(</span><span class="syntaxstring">'Content-type: application/xml'</span><span class="syntaxkeyword">);<br /><br /></span><span class="syntaxcomment">// On instancie la classe XML Writer & on créer le fichier "partners.xml".<br /></span><span class="syntaxdefault">$xml </span><span class="syntaxkeyword">=</span><span class="syntaxdefault"> new XMLWriter</span><span class="syntaxkeyword">();<br /></span><span class="syntaxdefault">$xml</span><span class="syntaxkeyword">-></span><span class="syntaxdefault">OpenURI</span><span class="syntaxkeyword">(</span><span class="syntaxstring">'partners.xml'</span><span class="syntaxkeyword">);<br /><br /></span><span class="syntaxcomment">// On indique que nous voulons que le code soit indenté.<br /></span><span class="syntaxdefault">$xml</span><span class="syntaxkeyword">-></span><span class="syntaxdefault">setIndent</span><span class="syntaxkeyword">(</span><span class="syntaxdefault">True</span><span class="syntaxkeyword">);<br /><br /></span><span class="syntaxcomment">// On indique le type de du document XML.<br /></span><span class="syntaxdefault">$xml</span><span class="syntaxkeyword">-></span><span class="syntaxdefault">startDocument</span><span class="syntaxkeyword">(</span><span class="syntaxstring">'1.0'</span><span class="syntaxkeyword">,</span><span class="syntaxdefault"> </span><span class="syntaxstring">'ISO-8859-1);<br /><br />// Ajoutons un noeud : <partners><br />$xml->startElement('</span><span class="syntaxdefault">partners</span><span class="syntaxstring">');<br /><br />// Tag: <url>Adresse du partenaire</url><br />$xml->writeElement('</span><span class="syntaxdefault">url</span><span class="syntaxstring">', '</span><span class="syntaxdefault">http</span><span class="syntaxkeyword">:</span><span class="syntaxcomment">//www.cadernis.fr');<br /><br />// On ferme le noeud.<br /></span><span class="syntaxdefault">$xml</span><span class="syntaxkeyword">-></span><span class="syntaxdefault">endElement</span><span class="syntaxkeyword">();<br /><br /></span><span class="syntaxcomment">// Si on écrit dans le fichier.<br /></span><span class="syntaxdefault">$xml</span><span class="syntaxkeyword">-></span><span class="syntaxdefault">flush</span><span class="syntaxkeyword">();</span><span class="syntaxdefault"> <br />?><br /></span></span>
- Mise en pratique, développement d'un writer de flux RSS :
Nous allons maintenant voir comment créer un flux RSS à partir d'un tableau contenant des actualités :
<span class="syntaxdefault"><?php<br /></span><span class="syntaxcomment">// On assigne le tableau contenant les actualités.<br /></span><span class="syntaxdefault">$news</span><span class="syntaxkeyword">[] = array(<br /></span><span class="syntaxstring">'title' </span><span class="syntaxkeyword">=> </span><span class="syntaxstring">'Le lancement de notre nouveau bot!'</span><span class="syntaxkeyword">,<br /></span><span class="syntaxstring">'url' </span><span class="syntaxkeyword">=> </span><span class="syntaxstring">'http://www.lesitedubot.com/le-lancement-du-nouveau-bot'</span><span class="syntaxkeyword">,<br /></span><span class="syntaxstring">'description' </span><span class="syntaxkeyword">=> </span><span class="syntaxstring">'Notre équipe à le plaisir de vous annoncer la sortie d\'un nouveau bot aux propriétés stupéfiantes!'</span><span class="syntaxkeyword">,<br /></span><span class="syntaxstring">'date' </span><span class="syntaxkeyword">=> </span><span class="syntaxstring">'2012-09-25'<br /></span><span class="syntaxkeyword">);<br /><br /></span><span class="syntaxdefault">$xml </span><span class="syntaxkeyword">= new </span><span class="syntaxdefault">XMLWriter</span><span class="syntaxkeyword">();<br /></span><span class="syntaxdefault">$xml</span><span class="syntaxkeyword">-></span><span class="syntaxdefault">openURI</span><span class="syntaxkeyword">(</span><span class="syntaxstring">'feedNews.rss'</span><span class="syntaxkeyword">);<br /></span><span class="syntaxdefault">$xml</span><span class="syntaxkeyword">-></span><span class="syntaxdefault">setIndent</span><span class="syntaxkeyword">(</span><span class="syntaxstring">'true'</span><span class="syntaxkeyword">);<br /></span><span class="syntaxdefault">$xml</span><span class="syntaxkeyword">-></span><span class="syntaxdefault">startDocument</span><span class="syntaxkeyword">(</span><span class="syntaxstring">'1.0'</span><span class="syntaxkeyword">, </span><span class="syntaxstring">'UTF-8'</span><span class="syntaxkeyword">);<br /><br /></span><span class="syntaxcomment">// On ouvre le noeud <rss> et on écrit ses attributs.<br /></span><span class="syntaxdefault">$xml</span><span class="syntaxkeyword">-></span><span class="syntaxdefault">startElement</span><span class="syntaxkeyword">(</span><span class="syntaxstring">'rss'</span><span class="syntaxkeyword">);<br /></span><span class="syntaxdefault">$xml</span><span class="syntaxkeyword">-></span><span class="syntaxdefault">writeAttribute</span><span class="syntaxkeyword">(</span><span class="syntaxstring">'version'</span><span class="syntaxkeyword">, </span><span class="syntaxstring">'1.0'</span><span class="syntaxkeyword">);<br /></span><span class="syntaxdefault">$xml</span><span class="syntaxkeyword">-></span><span class="syntaxdefault">writeAttribute</span><span class="syntaxkeyword">(</span><span class="syntaxstring">'xmlns:dc'</span><span class="syntaxkeyword">, </span><span class="syntaxstring">'http://purl.org/dc/elements/1'</span><span class="syntaxkeyword">);<br /></span><span class="syntaxcomment">// On ouvre le noeud <channel>.<br /></span><span class="syntaxdefault">$xml</span><span class="syntaxkeyword">-></span><span class="syntaxdefault">startElement</span><span class="syntaxkeyword">(</span><span class="syntaxstring">'channel'</span><span class="syntaxkeyword">);<br /></span><span class="syntaxdefault">$xml</span><span class="syntaxkeyword">-></span><span class="syntaxdefault">writeElement</span><span class="syntaxkeyword">(</span><span class="syntaxstring">'title'</span><span class="syntaxkeyword">, </span><span class="syntaxstring">'RSS avec XMLWriter'</span><span class="syntaxkeyword">);<br /></span><span class="syntaxdefault">$xml</span><span class="syntaxkeyword">-></span><span class="syntaxdefault">writeElement</span><span class="syntaxkeyword">(</span><span class="syntaxstring">'link'</span><span class="syntaxkeyword">, </span><span class="syntaxstring">'http://www.lesitedubot.com'</span><span class="syntaxkeyword">);<br /></span><span class="syntaxdefault">$xml</span><span class="syntaxkeyword">-></span><span class="syntaxdefault">writeElement</span><span class="syntaxkeyword">(</span><span class="syntaxstring">'description'</span><span class="syntaxkeyword">, </span><span class="syntaxstring">'Flux RSS écrit avec XMLWriter'</span><span class="syntaxkeyword">);<br /><br />foreach(</span><span class="syntaxdefault">$news </span><span class="syntaxkeyword">as </span><span class="syntaxdefault">$new</span><span class="syntaxkeyword">) <br />{<br /> </span><span class="syntaxcomment">// On écrit entre le noeud <item> tout <br /> </span><span class="syntaxdefault">$xml</span><span class="syntaxkeyword">-></span><span class="syntaxdefault">startElement</span><span class="syntaxkeyword">(</span><span class="syntaxstring">'item'</span><span class="syntaxkeyword">);<br /> </span><span class="syntaxdefault">$xml</span><span class="syntaxkeyword">-></span><span class="syntaxdefault">writeElement</span><span class="syntaxkeyword">(</span><span class="syntaxstring">'title'</span><span class="syntaxkeyword">, </span><span class="syntaxdefault">htmlspecialchars</span><span class="syntaxkeyword">(</span><span class="syntaxdefault">$new</span><span class="syntaxkeyword">[</span><span class="syntaxstring">'title'</span><span class="syntaxkeyword">]));<br /> </span><span class="syntaxdefault">$xml</span><span class="syntaxkeyword">-></span><span class="syntaxdefault">writeElement</span><span class="syntaxkeyword">(</span><span class="syntaxstring">'link'</span><span class="syntaxkeyword">, </span><span class="syntaxdefault">htmlspecialchars</span><span class="syntaxkeyword">(</span><span class="syntaxdefault">$new</span><span class="syntaxkeyword">[</span><span class="syntaxstring">'url'</span><span class="syntaxkeyword">]));<br /> </span><span class="syntaxdefault">$xml</span><span class="syntaxkeyword">-></span><span class="syntaxdefault">startElement</span><span class="syntaxkeyword">(</span><span class="syntaxstring">'description'</span><span class="syntaxkeyword">);<br /> </span><span class="syntaxcomment">// On écrit le noeud description dans une section Cdata pour éviter qu'un caractère spéciale ne casse la validité du document XML.<br /> </span><span class="syntaxdefault">$xml</span><span class="syntaxkeyword">-></span><span class="syntaxdefault">writeCData</span><span class="syntaxkeyword">(</span><span class="syntaxdefault">$new</span><span class="syntaxkeyword">[</span><span class="syntaxstring">'description'</span><span class="syntaxkeyword">]);<br /> </span><span class="syntaxdefault">$xml</span><span class="syntaxkeyword">-></span><span class="syntaxdefault">endElement</span><span class="syntaxkeyword">();<br /> </span><span class="syntaxdefault">$xml</span><span class="syntaxkeyword">-></span><span class="syntaxdefault">endElement</span><span class="syntaxkeyword">();<br />}<br /><br /></span><span class="syntaxdefault">$xml</span><span class="syntaxkeyword">-></span><span class="syntaxdefault">endElement</span><span class="syntaxkeyword">();<br /></span><span class="syntaxdefault">$xml</span><span class="syntaxkeyword">-></span><span class="syntaxdefault">endElement</span><span class="syntaxkeyword">();<br /></span><span class="syntaxdefault">$xml</span><span class="syntaxkeyword">-></span><span class="syntaxdefault">endDocument</span><span class="syntaxkeyword">();<br /></span><span class="syntaxdefault">$xml</span><span class="syntaxkeyword">-></span><span class="syntaxdefault">flush</span><span class="syntaxkeyword">();<br /></span><span class="syntaxdefault">?></span>
On obtient alors à la racine de notre script le fichier feedNews.rss suivant :
<?xml version="1.0" encoding="UTF-8"?>
<rss version="1.0" xmlns:dc="http://purl.org/dc/elements/1">
<channel>
<title>RSS avec XMLWriter</title>
<link>http://www.lesitedubot.com</link>
<description>Flux RSS écrit avec XMLWriter</description>
<item>
<title>Le lancement de notre nouveau bot!</title>
<link>http://www.lesitedubot.com/le-lancement-du-nouveau-bot</link>
<description><![CDATA[Notre équipe à le plaisir de vous annoncer la sortie d'un nouveau bot aux propriétés stupéfiantes!]]></description>
</item>
</channel>
</rss>
- Lire notre flux RSS avec SimpleXML.
{U.C}