SimpleXML et sections CDATA

PHP5 inclut de base la bibliothèque SimpleXML qui permet, comme son nom l'indique de gérer de manière très simple du code XML.

Un point est par contre problématique, la gestion des sections CDATA. En effet, supposons que l'on parte du code XML suivant :

<?xml version="1.0"?>
<root>
	<parent>
		<child>123</child>
		<child><![CDATA[456]]></child>
		<child attr="a"><![CDATA[789]]></child>
	</parent>
</root>

Lorsque l'on récupère les enfants d'un nœud via :

$parentnode->child;

On a la mauvaise surprise de ne pas obtenir tous les nœuds... En effet :

  • le premier passe sans problème, car il ne contient pas de section CDATA.
  • le second contient un CDATA et se perd dans la nature...
  • le troisième contient un CDATA mais a également un attribut, il est alors correctement renvoyé (ne me demandez pas pourquoi).

Par contre, dans le cas où tous les nœuds sont basés sur le modèle du second (CDATA sans attribut), le premier est bien trouvé et retourné (au lieu d'un tableau).

Une fois le problème identifié j'ai fait quelques recherches et j'ai pu trouver cette solution consistant à éliminer les CDATA avant le traitement du code XML. Je ne la trouve pas très satisfaisante mais je n'ai pour l'instant rien trouvé d'autre...

Soumettre un commentaire

La soumission de commentaire fonctionne via un envoi de mail à une adresse dédiée, pour plus de précisions sur les raisons de ce fonctionnement atypique vous pouvez consulter cet article.

2 commentaires

En effet pas trés élégant comme solution

On a peine a croire qu'on ne puisse pas traité correctement les CDATA avec php5.
Depuis ce poste toujours rien de satisfaisant de mis en place ??

En l'occurrence, j'ai supposé dans mon script qu'il y aurait toujours un attribut quand on utiliserait des CDATA (enfin dans l'immédiat je ne me sers même pas de ce script en fait :D)...

Maintenant ce sera peut-être corrigé bientôt (voire ça l'est déjà, ça m'étonnerait que j'aie la toute dernière version de php).