Accès aux données XML
Une fois le fichier XML correctement lu, on retrouve la
même syntaxe puissante qu'avec les outils de conversions
XML vers des tableaux PHP. SimpleXML simplifie considérablement
l'accès aux données en jouant sur sa nature de ressource
PHP : elle est à la fois un tableau et un objet. La ressource
retournée représente simplement la racine de notre document
XML. Il ne reste plus qu'à accéder aux attributs et aux
sous-balises.
Le contenu d'une balise est scindé en sous-balises. Le contenu
de chaque balise est affecté à un membre de la balise parente,
sous le même nom que la balise. Si plusieurs sous-balises
ont le même nom, elles sont rangées en tableau, et indexées
numériquement. C'est ce qui arrive à notre balise 'style'
ici. Il y a deux balises styles, et l'objet $bibliotheque
contient un membre appelé 'style', qui est un tableau. Nous
pouvons le passer à l'instruction foreach(),
et passer en revue toutes les balises 'style'.
Chaque balise 'style' contient deux balises distinctes :
auteur et titre. Comme elles sont uniques dans chaque balise
style, il suffit de les appeler par leur nom, et les données
contenues ont été enregistrées comme valeur, sous forme
de chaîne de caractères.
Accès
aux attributs
Les attributs sont aussi décodés et placés dans un tableau
particulier. C'est en fait la même variable que l'objet
que l'on utilise pour accéder aux différentes sous-balises.
Ainsi :
$style->livre nous renvoie
la sous-balise livre de balise style.
$style['livre'] nous renverrait
la valeur de l'attribut livre de la balise 'style', s'il
existe.
SimpleXML utilise donc les deux notations simultanément
: tableau et objet. C'est très pratique pour identifier
rapidement les données que vous manipulez, et pour leur
donner des espaces de noms distincts.
Pour être complet, SimpleXML dispose de deux méthodes qui
retournent la liste complète des attributs et des sous-balises
et de leurs valeurs respectives. Il s'agit des méthodes
attributes() et children().
On les utilise comme ceci :
Liste des attributs
<?php
$string = <<<XML
<a>
<foo attribut1="un" attribut2="deux">1</foo>
</a>
XML;
$xml = simplexml_load_string($string);
foreach($xml->foo[0]->attributes() as $a => $b) {
echo $a, '="', $b, "\"\n";
}
?>
Ce script va afficher :
attribut1="un"
attribut2="deux"
Liste des sous-balises
<?php
$string = <<<XML
<a>
<b>1</b>
<b>2</b>
<b>3</b>
<b>4</b>
</a>
XML;
$xml = simplexml_load_string($string);
foreach($xml->children() as $a => $b) {
echo $a, '="', $b, "\"\n";
}
?>
Ce script va afficher :
b="1"
b="2"
b="3"
b="4"