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 :

Code (XML) <?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 :

Code (PHP) $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…

2 commentaires pour “SimpleXML et sections CDATA”

  1. pstl dit :

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

  2. Darathor dit :

    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).

Laisser un commentaire

Vous pouvez utiliser ces tags XHTML : <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

Veuillez recopier le code de sécurité.

Ce site fait partie du réseau Edforum.net. À ce titre, il suit les règles globales du réseau, merci d'en prendre connaissance avant de poster votre message.