SimpleXML : une librairie pour gérer XML avec PHP
SimpleXML est une librairie pour gérer le XML avec PHP. Simple (c'est le but) elle vous désorientera parfois par certains points. Cette page liste quelques éléments à savoir pour ne pas être surpris devant certains comportements de SimpleXML.Typecasting
La majorité des objets SimpleXML sont ... des objets. Ce qui faut dire que si vous voulez faire des comparaisons (dans des if) ou faire pas mal de trucs avec, vous devrez absolument les typecaster en chaine ou entier selon vos besoins :
if ((string) $xml->tag == 'bon contenu') ...
Le premier par défaut ou la confusion entre objet et tableau
Si vous avez un objet $xml issu de :
<xml>
<fruits>
<fruit>pomme</fruit>
<fruit>poire</fruit>
</fruits>
</xml>
$xml->fruits->fruit est synonyme de $xml->fruits->fruit[0]
Certainnes personnes expliquent qu'une vilaine conséquence de ceci est que count($xml->fruits->fruit) vous retournera 1 alors que vous pensiez compter le nombre de tag <fruit>.
En fait, il faut comprendre que $xml->fruits->fruit est un objet, mais que SimpleXML vous laisse l'utiliser comme un array. Mais ça fausse certains comportements.
Il faudrait donc faire une boucle pour compter les fruits :
$count = 0;
foreach($xml->fruits->fruit as $fruit) $count++;
De mon coté, je ne constate PAS ce comportement, et count() me renvoie bien le bon nombre. Bizarre.Attention à var_dump et print_r
L'itérateur de l'objet SimpleXML (->) a été surchargé. De ce fait, les fonctions d'analyse de structure telles var_dump() et print_r() ne marchent pas forcément bien, et oublient parfois certains éléments ou arguments. Mieux vaut les éviter, ou se méfier de leurs résultats.
Attention aux mélanges
SimpleXML ne gère PAS les mélanges tels :
<p>SimpleXML ne gère <b>PAS</b> les mélanges</p>
echo $p->b donne 'PAS'
echo $p donne 'SimpleXML ne gère les mélanges'
et $p->asXML() ne permettra PAS de reconstruire le XML initial.
Conclusion malheureuse : il ne faut pas utiliser SimpleXML pour manipuler du XHTML.
Mathématique et objets
Quand on fait des mathématiques avec des objets, PHP les considère comme des entiers. Ainsi, si vous avez un objet $xml créé à partir de :
<monxml><a>3.5</a><b>4.2</b></monxml>
$xml->a + $xml->b donnera 7.
Il faut lancer (type cast in english) dans des floats pour garder les décimales :
(float) $xml->a + (float) $xml->b donnera bien 7.7.
Etendre SimpleXML
SimpleXML possède très peu de fonctions de manipulation du DOM. Si vous travailler beaucoup sur votre DOM donc (ajout de branches, recherche de parent, etc ...) vous viendrez très rapidement à bout de SimpleXML. Une solution est d'étendre SimpleXML avec SXE, qui va ajouter pas mal de fonction de manipulation d'arbre incontournables.
Pour utiliser SXE, il suffit d'inclure la classe (évidemment), et de créer ses objets XML avec 'SXE' comme deuxième argument :
$myXMLObj = simplexml_load_file($xmlFile,'SXE');Si vous voulez étendre SimpleXML, vous pouvez aussi lire cet article :
Extending SimpleXML
Ecrire votre commentaire
Vous devez vous connecter pour pouvoir ajouter un commentaire.