Les derniers articles
PHP5 : Utilisation de XMLWriter
Date :: 2006-12-10
Last Updated :: 2006-12-16
Introduction
XMLWriter
est une extension PHP désormais disponible par défaut depuis la version
5.1.2
qui permet, comme son nom l'indique, de créer des documents XML.
Cette extension peut être utilisée de manière procédurale ou orientée objet.
Dans cette petite introduction, nous verrons comment utiliser un certain nombre des méthodes de cette extension
dans le but de créer un fichier RSS.
Un exemple basique
Pour comprendre le fonctionnement simple de cette extension, commençons directement par un morceau de code PHP
permettant de créer un document XML basique.
Comme vous pouvez le constater, le nommage des méthodes est uniforme et explicite :
Code PHP
// Nouvelle Instance de la classe XMLWriter
$X = new XMLWriter();
// Nouveau XMLWriter en mémoire
$X->openMemory();
// Nouveau document XML 1.0 avec un encodage ISO-8859-1
$X->startDocument('1.0', 'ISO-8859-1');
// Tag principal : <root> [1]
$X->startElement ('root');
// Tag : <tag>value</tag>
$X->writeElement('tag' , 'value');
// [1] Fermeture du tag principal
$X->endElement();
// Affichage du résultat
echo $X->flush();
?>
Résultat
Voici le document XML produit :
<root><tag>value</tag></root>
Quelques explications
Voici les méthodes utilisées :
- XMLWriter::__construct() : Nouvelle instance de la classe XMLWriter
- XMLWriter::openMemory() : Création de notre objet en mémoire
- XMLWriter::startDocument( XML_Version , Encoding ) : Début du document
- XMLWriter::startElement( Name ) : Création d'une balise ouvrante [1]
- XMLWriter::writeElement( Name , Value ) : Création d'une balise complète
- XMLWriter::endElement() : Ferme le dernier élément ouvert avec startElement()
- XMLWriter::flush() : Affiche notre XML
Simple, non ?
Et bien NON, car c'est encore plus simple !
Toutes les méthodes permettant de créer des éléments de notre fichier XML fonctionnent de la même manière,
à savoir :
- XMLWriter::XMLWriter::start***() : Début d'un élément
- XMLWriter::end***() : Fin d'un élément
- XMLWriter::write***() : Elément complet
*** peut être :
- Attribute : Un attribut, nom="valeur"
- AttributeNs : Un attribut avec espace de nom, espace:nom="valeur" xmlns="..."
- Cdata : Une section CDATA , <![CDATA[......]]>
- Comment : Une commentaire, <!-- ... -->
- DtdAttlist : Balise de DTD attlist, <!ATTLIST ....>
- Dtd : Une DTD
- DtdEntity : Balise de DTD entity, <!ENTITY ....>
- DtdElement : Balise de DTD element, <!ELEMENT ....>
- Element : Un élément
- ElementNs : Un élément avec espace de nom
- Pi : Un pi, <?PI ?>
- Text : Du texte
Nous disposons donc, par exemple des méthodes :
- XMLWriter::startAttribute()
- XMLWriter::endCdata()
- XMLWriter::writeComment()
- etc
Créons notre fichier RSS
Declaration XML et balise principale
En reprenant l'exemple précédent, nous allons créer la base de notre fichier RSS, à savoir la balise racine <rss version="2.0"> et la balise <title>
<rss version="2.0">
<channel>
<title>value</title>
</channel>
</rss>
Quelles différences avec le code XML généré précédemment ?
- Le code est indenté :) : utilisation de la méthode XMLWriter::setIndent()
- La balise <rss> possède un attribut version. Nous allons le définir grâce à la méthode XMLWriter::writeAttribute()
Code PHP mis en oeuvre
// Nouvelle Instance de la classe XMLWriter
$X = new XMLWriter;
// Nouveau XMLWriter en mémoire
$X->openMemory();
// On indente le code de sortie
$X->setIndent(true);
// Nouveau document XML 1.0 avec un encodage ISO-8859-1
$X->startDocument('1.0', 'ISO-8859-1');
// Tag principal : <rss> [1]
$X->startElement ('rss');
// On ecrit l'attribut : version="2.0"
$X->writeAttribute('version' , '2.0');
// Tag : <channel> [2]
$X->startElement ('channel');
// Tag : <title>Mon RSS</title>
$X->writeElement('title' , 'Mon RSS');
// [2] Fermeture du tag
$X->endElement();
// [1] Fermeture du tag principal
$X->endElement();
// Affichage du résultat
echo $X->flush();
?>
Continuons
A partir de l'exemple précédent, ajoutons les balises <link> et <description> et un commentaire. Nous ajouterons également la declaration de l'espace de nom dc.
- XMLWriter::writeComment() : Ajoute le commentaire
$X = new XMLWriter();
$X->openMemory();
$X->setIndent(true);
$X->startDocument('1.0', 'ISO-8859-1');
// Un commentaire
$X->writeComment('XMLWriter - PHP5.2');
$X->startElement ('rss'); // [1]
$X->writeAttribute('version' , '2.0');
$X->writeAttribute('xmlns:dc' , 'http://purl.org/dc/elements/1.1/');
$X->startElement ('channel'); // [2]
// Tag : <title>
// Tag : <link>
// Tag : <description>
$X->writeElement('title' , 'Mon RSS');
$X->writeElement('link' , 'http://classes.Scriptsphp.org/rss');
$X->writeElement('Description' , 'Mon premier fil RSS');
// [1]
// [2]
$X->endElement();
$X->endElement();
// Affichage du résultat
echo $X->flush();
?>
Résultat :
<!--XMLWriter - PHP5.2-->
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/">
<title>Mon RSS</title>
<link>http://classes.Scriptsphp.org/rss</link>
<Description>Mon premier fil RSS</Description>
</rss>
Les items
Rajoutons les <item> de notre fichier RSS.
Pour l'exemple, nous allons supposer que les informations à insérer sont stockées dans un tableau PHP,
nommé $infos.
Quelques nouvelles méthodes
- XMLWriter::writeCdata( Content ) : Ajoute une section CDATA
- XMLWriter::writePi() : Ajoute une balise PI : <?xml-stylesheet ... ?>
- XMLWriter::openUri( File ) : Nous allons ecrire le résultat dans un fichier nommé test.xml
// Informations à insérer dans le flux RSS
$infos[] = array(
'title' => 'Le buzz du web2.0',
'url' => 'http://classes.scriptsphp.org/plouf',
'description' => '......',
'date' => '2006-12-25'
);
$infos[] = array(
'title' => 'Nouveau site',
'url' => 'http://classes.scriptsphp.org/plouf/plaf',
'description' => '<p>du html</p>',
'date' => '2006-12-24'
);
// -------------------------------------------
$X = new XMLWriter();
// Nouvel XMLWriter dans un fichier
$X->openUri('test.xml');
$X->setIndent(true);
$X->startDocument('1.0', 'ISO-8859-1');
// PI
$X->writePi('xml-stylesheet' , 'type="text/css" href="/mon-style.css"');
$X->writeComment('XMLWriter - PHP5.2');
$X->startElement ('rss'); // [1]
$X->writeAttribute('version' , '1.0');
$X->writeAttribute('xmlns:dc' , 'http://purl.org/dc/elements/1.1/');
$X->startElement ('channel'); // [2]
$X->writeElement('title' , 'Mon RSS');
$X->writeElement('link' , 'http://classes.Scriptsphp.org/rss');
$X->writeElement('Description' , 'Mon premier fil RSS');
foreach($infos as $v) {
$X->startElement('item');
$X->writeElement('title' , $v['title']);
$X->writeElement('link' , $v['url']);
$X->startElement('description');
// Section CDATA
$X->writeCdata($v['description']);
$X->endElement();
$X->endElement();
}
// [2] Fermeture
$X->endElement();
// [1] Fermeture du tag principal
$X->endElement();
// Enregistrement du résultat
$X->flush();
?>
Résultat
Nous obtenons bien un fichier nommé test.xml contenant le code suivant :
<?xml-stylesheet type="text/css" href="/mon-style.css"?>
<!--XMLWriter - PHP5.2-->
<rss version="1.0" xmlns:dc="http://purl.org/dc/elements/1.1/">
<channel>
<title>Mon RSS</title>
<link>http://classes.Scriptsphp.org/rss</link>
<Description>Mon premier fil RSS</Description>
<item>
<title>Le buzz du web2.0</title>
<link>http://classes.scriptsphp.org/plouf</link>
<description><![CDATA[......]]></description>
</item>
<item>
<title>Nouveau site</title>
<link>http://classes.scriptsphp.org/plouf/plaf</link>
<description><![CDATA[<p>du html</p>]]></description>
</item>
</channel>
</rss>
Et voilà, un beau document RSS.
Liens utiles
Fabrice Lezoray < fabrice AT scriptsphp.org >.
Trackback
Il n'y a pas de trackback recensé pour cet article.
Faire un trackback sur cet article http://classes.scriptsphp.org/Trackbackserver.Utilisation-de-XMLWriter, récupérer les trackback sur cet article