Modifier cdata dans un xml

cs_marine34000 Messages postés 16 Date d'inscription jeudi 7 octobre 2010 Statut Membre Dernière intervention 3 novembre 2010 - 7 oct. 2010 à 15:06
neigedhiver Messages postés 2480 Date d'inscription jeudi 30 novembre 2006 Statut Membre Dernière intervention 14 janvier 2011 - 7 oct. 2010 à 17:38
Salut :-)

J'ai un problème pour modifier les cdata

<?xml version="1.0" encoding="utf-8"?>
<contact>
<content>le test</content>
<lecontent><![CDATA[pour le test]]></lecontent>
</contact>


j'ai trouvé ce code:

<?php
$manouvellevaleur = 'un autre tessssst';
$xml = simplexml_load_file('contact.xml');
$xml->addChild('lecontent', '<![CDATA['.$manouvellevaleur.']]>');
echo $xml->asXML();
?>


Mais ca me donne

<?xml version="1.0" encoding="utf-8"?>
<contact>
<content>le test</content>
<lecontent><![CDATA[pour le test]]></lecontent>
<lecontent><![CDATA[un autre tessssst]]></lecontent>
</contact>


quelqu'un a la solution ?

Marine
A voir également:

3 réponses

neigedhiver Messages postés 2480 Date d'inscription jeudi 30 novembre 2006 Statut Membre Dernière intervention 14 janvier 2011 19
7 oct. 2010 à 17:11
Salut,

En fait, avec SimpleXMLElement, c'est tellement simple de manipuler du XML qu'on a tendance à se compliquer la vie...
Il m'a fallu un peu de temps pour trouver la réponse au problème, mais en fait, c'est hyper simple...
Comme tu le montres dans ton exemple, lorsque l'on insère du texte dans un élément, il est automatiquement protégé. C'est à dire que les caractères interdits que sont <, > et & sont automatiquement encodés. Ainsi, < devient < > devient > et enfin, & devient &
Il existe deux type de données textes : CDATA et PCDATA. La seule différence réside dans le fait qu'une donnée PCDATA n'est pas interprétée par l'analyseur XML, contrairement à une donnée CDATA.
La raison d'être des données CDATA est de permettre d'écrire du texte qui ne sera pas analysé et contenant des caractères spéciaux (<, > ou &). C'est tout.
Par défaut, toutes les données sont des PCDATA. Quand SimpleXML encode les données textes, elles ne seront plus analysées, puisque les caractères spéciaux, qui indiquent un début d'analyse (< servant à ouvrir un nouvel élément, & à définir un caractère spécial) ne sont plus interprétables, puisqu'encodés.

En somme, il n'est pas nécessaire, quand on utilise un tel outil, de chercher à y mettre les tags <![CDATA[ et ]]> puisque le contenu ne sera jamais analysé.

Je sais pas si j'ai été clair...

--
Neige

Souvent la réponse à votre question se trouve dans la doc. Commencez par là ;)
0
cs_marine34000 Messages postés 16 Date d'inscription jeudi 7 octobre 2010 Statut Membre Dernière intervention 3 novembre 2010
7 oct. 2010 à 17:26
Sympa la réponse merci :-)

Tu veux dire qu'on a pas besoin d'utiliser <![CDATA[ et ]]> ??

Le problème c'est que mes xml marche avec flash et utilise tous des cdata

:-(

(j'ai bien compris ?? lol)
0
neigedhiver Messages postés 2480 Date d'inscription jeudi 30 novembre 2006 Statut Membre Dernière intervention 14 janvier 2011 19
7 oct. 2010 à 17:38
Alors il faut écrire le fichier manuellement.
C'est à dire qu'il faut récupérer la chaîne XML ($xml -> asXml()) et remplacer les chaînes "cdata" encodées par leur équivalent décodé. Ca pourrait ressembler à quelque chose dans ce genre :

$enc = array('&lt:![CDATA[', ']]>');
$dec = array('<![CDATA[', ']]>');

$finalXml = str_replace($enc, $dec, $xml -> asXml());

file_put_contents($destination_xml_file, $finalXml);


Avec ça, il faut penser à écrire manuellement les <![CDATA[ et ]]> dans les chaînes que l'on stocke dans le XML, à chaque fois ;)

--
Neige

Souvent la réponse à votre question se trouve dans la doc. Commencez par là ;)
0
Rejoignez-nous