Logo classes.scriptsphp.org PHP

go to nav bar

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

<?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 :

<?xml version="1.0" encoding="ISO-8859-1"?>
<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>

<?xml version="1.0" encoding="ISO-8859-1"?>
<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

<?php 

// 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
<?php 
$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 :

<?xml version="1.0" encoding="ISO-8859-1"?>
<!--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
<?php 
// 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 version="1.0" encoding="ISO-8859-1"?>
<?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

Merci de ne pas suivre ce lien emails.

0.0664s | «»
PHP powered