Php xml ajouter un cdata à un noeud

lestephnet Messages postés 17 Date d'inscription samedi 29 mars 2003 Statut Membre Dernière intervention 6 octobre 2010 - 29 sept. 2010 à 12:35
neigedhiver Messages postés 2480 Date d'inscription jeudi 30 novembre 2006 Statut Membre Dernière intervention 14 janvier 2011 - 7 oct. 2010 à 17:12
Bonjour je voudrais trouver une solution pour ajouter un nœud CDATA à mon xml

mon xml////////////contact.xml

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

Mon php //////
<?php
$xmlfile = simplexml_load_file('contact.xml');

///Valeur à mettre entre <![CDATA[ ]]>
$manouvellevaleur = "letesttttttttttttttt";

foreach ($xmlfile->contact as $fiche) {
echo $fiche->content,'
';
echo $fiche->lecontent,'
';
//echo $fiche->node['mail'],'
';
echo "--------------------------------------------
";
$fiche->lecontent=$manouvellevaleur;
}
$xmlfile->asXML('contact2.xml');
?>
///////////

J'ai voulu utiliser un createCDATASection(data)
mais je n'ai pas réussi à l'ajouter à mon code.

Avez vous une solution ?
Merci d'avance
steph

6 réponses

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

SimpleXMLElement n'est pas vraiment conçu pour manipuler des fichiers XML. Il est très très performant en lecture, mais pas en modification. Il est préférable, pour cela, d'utiliser DOM bien plus puissant (mais un peu plus compelxe à utiliser).

--
Neige

Souvent la réponse à votre question se trouve dans la doc. Commencez par là ;)
0
lestephnet Messages postés 17 Date d'inscription samedi 29 mars 2003 Statut Membre Dernière intervention 6 octobre 2010
29 sept. 2010 à 16:57
Merci de ta réponse,

En général j'utilise un dom, mais je n'arrive pas à lire les balises CDATA.
Je connais le site http://www.phpcs.com, je passe toujours sur ce site.

Justement si je pose la question sur le forum c'est que j'ai déjà de mon coté fait pas mal de test pour trouver moi même la solution et j'arrive a une impasse.

Je cherche une solution propre pour ajouter un CDATA avec DOM ou SimpleXMLElement.

Si quelqu'un à une solution... Merci d'avance :-)

steph
0
neigedhiver Messages postés 2480 Date d'inscription jeudi 30 novembre 2006 Statut Membre Dernière intervention 14 janvier 2011 19
29 sept. 2010 à 17:25
Pas de soucis, j'ai pas prétendu que t'avais pas cherché ;) (j'aurais été sévère si ç'avait été flagrant). Je pensais que tu restais sur SimpleXMLElement...

Première chose : ton fichier XML est mal formé. Donc tu ne peux pas le parcourir correctement.

Regarde la différence de ton script de test avec un fichier contact.xml comme celui-ci :
<?xml version="1.0" encoding="utf-8"?>
<contacts>
<contact>
<content>le test</content>
<lecontent>pour le test</lecontent>
</contact>
</contacts> 


Ou alors, essaie pour ta boucle foreach :
foreach ($xmlfile as $fiche) {

Je pense qu'avec ça, tu vois déjà où est le problème pour le parcours de ton fichier...
Je pense que la première correction que je te propose (un élément contacts qui contient chaque contact, élément à part entière) ton fichier xml est plus cohérent avec ce qu'il d'écrit. Par ailleurs, à ce moment là, ton script fonctionne correctement (c'est à dire que le contenu de <lecontent> est modifié correctement.

La principale difficulté est de savoir quel objet on a dans les mains, surtout quand on itère...
En reprenant le contact.xml que je te propose, essaie ça :

<?php

$xmlfile = simplexml_load_file('contact.xml');

///Valeur à mettre entre <![CDATA[ ]]>
$manouvellevaleur = "letesttttttttttttttt";

foreach ($xmlfile as $fiche) {
var_dump($fiche->content);
var_dump($fiche->lecontent);
//echo $fiche->node['mail'],'
';
echo "--------------------------------------------
";
$fiche->lecontent=$manouvellevaleur;
}
$contact = $xmlfile->addChild('contact');

$content = $contact -> addChild('content');
$contact -> content = 'Encore pour le test';

$lecontent = $contact -> addChild('lecontent');
$contact -> lecontent = 'Yooooooooooooooo';

$xmlfile->asXML('contact2.xml');
?> 


Moi, j'obtiens un fichier XML avec un deuxième élément <contact>, enfant de <contacts>. Bon, il manque la mise en forme, ce que SimpleXMLElement n'est pas supposé gérer. Sinon, le XML est bien formé.

--
Neige

Souvent la réponse à votre question se trouve dans la doc. Commencez par là ;)
0
lestephnet Messages postés 17 Date d'inscription samedi 29 mars 2003 Statut Membre Dernière intervention 6 octobre 2010
6 oct. 2010 à 17:22
Bonjour,

Merci pour la reponse


Comment modifier le
///Valeur à mettre entre <![CDATA[ ]]>
$manouvellevaleur = "letesttttttttttttttt";

$fiche->lecontent=$manouvellevaleur;

avec un cdata dans un XML avec un createCDATASection , un new DOMCDATASection ou un addCData ? Les docs que je trouve en ligne ne sont pas très claire.

steph
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
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:50
Bonjour steph,
Je cherche exactement le même système
Si je trouve avant je te dis


Marine
:-)
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:12
Salut,

J'avais pas bien compris la problématique, mais à lire le message de Marine, je pense que j'ai compris... Du coup, j'ai répondu à la suite de son message.
> http://www.phpcs.com/forum/sujet-MODIFIER-CDATA-DANS-XML_1472043.aspx#1


--
Neige

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