Précédent   Forum des professionnels en informatique > PHP > Bibliothèques et frameworks > XML > SimpleXML
SimpleXML Forum d'entraide pour l'extension SimpleXML, qui permet de manipuler des documents XML en PHP (approche DOM).
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 18/06/2007, 17h04   #1
Membre du Club
 
Avatar de Nillak
 
Inscription : octobre 2006
Messages : 138
Détails du profil
Informations personnelles :
Localisation : France, Hérault (Languedoc Roussillon)

Informations forums :
Inscription : octobre 2006
Messages : 138
Points : 45
Points : 45
Par défaut [SimpleXML] Ajouter un noeud avec addchild en premier

Bonjour,
j'utilise simpleXML et je souhaite ajouter un enfant à un noeud, par exemple <p> </p>, à mon flux:
Code :
1
2
3
4
<racine>
   <a> </a>
   <b> </b>
</racine>
mais je souhaiterais qu'il s'ajoute au début, i.e. avant <a> </a> pour obtenir :
Code :
1
2
3
4
5
<racine>
   <p> </p>
   <a> </a>
   <b> </b>
</racine>
Or, je ne sais pas comment faire puisque la fonction addchild ajoute le noeud à la suite, et au lieu d'obtenir le flux précédent, j'obtiens :
Code :
1
2
3
4
5
<racine>>
   <a> </a>
   <b> </b>
   <p> </p>
</racine>
Est-ce que vous auriez la réponse à mon problème ?
Merci !
__________________
C'est pas parce qu'ils sont nombreux à avoir tort qu'ils ont raison ! (Pierre Desproges)
Nillak est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/06/2007, 19h20   #2
En attente de confirmation mail
 
Inscription : juin 2002
Messages : 6 164
Détails du profil
Informations forums :
Inscription : juin 2002
Messages : 6 164
Points : 6 404
Points : 6 404
SimpleXML n'offre pas ces manipulations, en revanche avec DOM c'est tout à fait possible.
julp est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/06/2007, 19h34   #3
Membre du Club
 
Avatar de Nillak
 
Inscription : octobre 2006
Messages : 138
Détails du profil
Informations personnelles :
Localisation : France, Hérault (Languedoc Roussillon)

Informations forums :
Inscription : octobre 2006
Messages : 138
Points : 45
Points : 45
Merci pour ta réponse Julp,
ce qui signifie pour moi, que si je veux continuer d'utiliser simplexml il faut que je reconstruise la chaîne xml dans sa totalité et cela pour conserver mon ordre, ou comment faire du compliqué avec du simple, si je comprends bien.
__________________
C'est pas parce qu'ils sont nombreux à avoir tort qu'ils ont raison ! (Pierre Desproges)
Nillak est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/06/2007, 19h52   #4
En attente de confirmation mail
 
Inscription : juin 2002
Messages : 6 164
Détails du profil
Informations forums :
Inscription : juin 2002
Messages : 6 164
Points : 6 404
Points : 6 404
Citation:
Envoyé par Nillak
ce qui signifie pour moi, que si je veux continuer d'utiliser simplexml il faut que je reconstruise la chaîne xml dans sa totalité et cela pour conserver mon ordre, ou comment faire du compliqué avec du simple, si je comprends bien.
Pourriez-vous être plus précis car je ne vois pas où vous voulez en venir ? Ne pourriez-vous pas vous passer de SimpleXML justement pour DOM. Par ailleurs, vous avez deux fonctions pour "basculer" d'une extension à l'autre (simplexml_import_dom et dom_import_simplexml - en plus des DomDocument::load($sxml->asXML()) et simplexml_load_string($dom->saveXML()) - mais vous consommez +/- deux fois plus de mémoire).
julp est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/06/2007, 21h26   #5
Membre du Club
 
Avatar de Nillak
 
Inscription : octobre 2006
Messages : 138
Détails du profil
Informations personnelles :
Localisation : France, Hérault (Languedoc Roussillon)

Informations forums :
Inscription : octobre 2006
Messages : 138
Points : 45
Points : 45
Une fois de plus merci pour cette réponse qui par ses fonctions répond à ma question.
Actuellement je cherche quelle est la manière la plus simple et la plus pratique de parser et modifier une chaîne de caratères qui est au format XML.
Cette chaîne est contenue dans une variable PHP et possède une structure très simple. Elle est créée via une chaîne existante, en d'autre terme mon script PHP est un intermédiaire entre deux programmes qui communiquent en XML. J'ai découvert simpleXML qui est nativement inclus dans PHP5 et je dois dire très agréable à utiliser. Ma contrainte est de modifier la chaîne XML en ajoutant un noeud à une place strictement définie ...
Je crois clairement maintenant qu'il faut que je m'oriente vers DOM étant donné la fonctionnalité dont j'ai besoin (i.e. insérer un noeud à une place particulière). Reste à savoir s'il est plus intéressant de faire la bascule entre DOM et simpleXML ou d'utiliser uniquement DOM ?
__________________
C'est pas parce qu'ils sont nombreux à avoir tort qu'ils ont raison ! (Pierre Desproges)
Nillak est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/06/2007, 22h00   #6
En attente de confirmation mail
 
Inscription : juin 2002
Messages : 6 164
Détails du profil
Informations forums :
Inscription : juin 2002
Messages : 6 164
Points : 6 404
Points : 6 404
Il est clair que l'interface SimpleXML est très agréable à utiliser mais on en découvre les limites dès qu'il s'agit de modifier l'arbre.

DOM d'après votre description vous suffit. SimpleXML par rapport à DOM facilite l'accès aux données (quand on connaît la structure et qu'on utilise pas de namespace). Si les performances vous importent peu et pour des raisons pratiques, vous pouvez tout à fait utiliser ces procédés pour passer de l'une à l'autre mais ce que vous pouvez faire avec SimpleXML peut être fait avec DOM.

Eventuellement, selon les modifications que vous souhaitez apporter, vous pouvez envisager les expressions régulières (PCRE) si ces modifications restent simples (ça a le mérite d'être portable PHP 4/5 mais ces fonctions traitent du texte : vous n'aurez pas de validation, ...).
julp est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/06/2007, 06h40   #7
Nouveau Membre du Club
 
Inscription : octobre 2006
Messages : 171
Détails du profil
Informations forums :
Inscription : octobre 2006
Messages : 171
Points : 32
Points : 32
Tu peux aussi mettre des données dans un tableaux et utiliser la fonction array_filter ou des fonctions dans ce genre
Mais bon ça fera un petit peu de code en plus ..
Klimium est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/05/2008, 16h54   #8
Invité régulier
 
Étudiant
Inscription : mai 2008
Messages : 10
Détails du profil
Informations personnelles :
Âge : 24

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : mai 2008
Messages : 10
Points : 6
Points : 6
Par défaut Meme problème, ...

Citation:
Envoyé par julp Voir le message
SimpleXML n'offre pas ces manipulations, en revanche avec DOM c'est tout à fait possible.
Salut,

Je cherche a faire la même chose : placer le nouveau noeud créé par appendChild en 1ere position mais je ne trouve nul part la solution !!

julp : tu dis que c'est facile avec DOM?
Comment ?

Merci de m'aider,

a bientôt.
ludoOo71 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/05/2008, 18h26   #9
Membre du Club
 
Avatar de Nillak
 
Inscription : octobre 2006
Messages : 138
Détails du profil
Informations personnelles :
Localisation : France, Hérault (Languedoc Roussillon)

Informations forums :
Inscription : octobre 2006
Messages : 138
Points : 45
Points : 45
Bonjour,
voilà une petite classe que j'ai retrouvé par hasard, elle est très loin d'être parfaite et demande à être remaniée, mais elle contient les éléments qui te serviront

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
<?php
 /*include_once("utilities.php");*/
 /*
 * Class adding <MYNODE> </MYNODE> in the XML flow in adding the id of the user.
 */
 class AddMYNODE2XML {
    private $strXmlOriginal = '';
    private $strXmlModified = '';
    private $MYNODE = 0;
    private $xml;
    private $error;
 
    public function __construct($strXmlFlow, $MYNODE) {
       if (isset ($strXmlFlow)){
          $this->strXmlOriginal = $strXmlFlow;
          $this->xml = new SimpleXMLElement($strXmlFlow);
          $this->MYNODE = $MYNODE;
          $this->strXmlModified = $this->handle_MYNODE($this->xml);
       }
       else {//function to display an error message
          $this->error = 'Error parameter constructeur AddMYNODE2XMLFlow::__construct file:class_addMYNODE.php';
       }
    }
 
    public function __destruct(){}
 
    /*************** function that modify the simpleXMLElement given as parameter
    *  @param simpleXMLElement xml_SimpleXML The SimpleXMLElement to transform
    *  @return string
    *******************/
    function handle_MYNODE($xml_SimpleXML) {
       if ($xml_SimpleXML === false) {
           $this->error = 'Error reading XML string in AddMYNODE2XMLFlow::handleFlow_MYNODE file:class_addMYNODE.php';
       }
       else {
       // get the name of the first child of the root element
          $tab = array();
          foreach ($xml_SimpleXML->children() as $second_gen) {
             $tab[] = $second_gen;
          }
          $firstNodeName = $tab[0]->getName();
       // transformation of the simpleXML object in a DomDocument
          $dom_sxe = dom_import_simplexml($xml_SimpleXML);
          if ($dom_sxe) {
             $dom = new DOMDocument('1.0');
             $dom_sxe = $dom->importNode($dom_sxe, true);
             $dom_sxe = $dom->appendChild($dom_sxe);
		// creation of the node to add in the XML structure
             $MYNODENode = $dom->createElement('MYNODE', $this->MYNODE);
			// get the list of node which have the same name as the first child of the root element
             $firstNodes = $dom->getElementsByTagName($firstNodeName);
             $firstNode = $firstNodes->item(0) ;
			// insertion of the new element as the top child of the root element
             $dom_sxe->insertBefore($MYNODENode, $firstNode);
             $SXE = simplexml_import_dom($dom_sxe);
             if (isset ($SXE)) {
                $this->xml = $SXE;
                return $SXE->asXML();
             }
             else {
                $this->error = 'Error during XML conversion DOM->SimpleXML in AddMYNODE2XMLFlow::handleFlow_MYNODE file:class_addMYNODE.php';
             }
          }
          else {
              $this->error = 'Error during XML conversion SimpleXML->DOM in AddMYNODE2XMLFlow::handleFlow_MYNODE file:class_addMYNODE.php';
          }
       }
    }
 
    function getStrXmlModified() {
       return encode_to_html($this->strXmlModified);
    }
    function getStrXmlOriginal() {
       return encode_to_html($this->strXmlOriginal);
    }
    function getXml() {
       return $this->xml;
    }
}//end class
?>
Bonne journée
__________________
C'est pas parce qu'ils sont nombreux à avoir tort qu'ils ont raison ! (Pierre Desproges)
Nillak est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/05/2008, 18h27   #10
En attente de confirmation mail
 
Inscription : juin 2002
Messages : 6 164
Détails du profil
Informations forums :
Inscription : juin 2002
Messages : 6 164
Points : 6 404
Points : 6 404
Citation:
Envoyé par ludoOo71
Je cherche a faire la même chose : placer le nouveau noeud créé par appendChild en 1ere position mais je ne trouve nul part la solution !!
Comme son nom l'indique, le but de cette méthode est d'ajouter le noeud à la suite des autres (en tant que dernier).

Citation:
Envoyé par ludoOo71
julp : tu dis que c'est facile avec DOM?
Comment ?
Il faut insérer avant (méthode insertBefore) le premier noeud enfant
julp est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/05/2008, 19h16   #11
Invité régulier
 
Étudiant
Inscription : mai 2008
Messages : 10
Détails du profil
Informations personnelles :
Âge : 24

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : mai 2008
Messages : 10
Points : 6
Points : 6
Merci de répondre si rapidement !!

pour reprendre l'exemple de nillak, il faut ajouter le noeud "p" dans la racine.

Avec un appendChild, c'est simple :

Citation:
$dom=new DomDocument();
$dom->load('fichier.xml');
$racine=$dom->documentElement;

$message=$dom->createElement("p");
$message=$racine->appendChild($message);
or, avec insertBefore c'est chaud... Je ne comprend pas du tout.
si je remplace "appendChild" par "insertBefore" il se passe la même chose : mon noeud est ajouté a la fin (trop fou : il n'y a aucune erreur !!)

j'ai donc regardé sur php.net : http://www.php.net/manual/fr/functio...ert-before.php

et là, j'ai essayé tout et n'importe quoi.
Il faut mettre a priori 2 paramètres. Mais j'arrive toujours a cette erreur :
Citation:
Fatal error: Uncaught exception 'DOMException' with message 'Not Found Error' in fichier.php:38 Stack trace: #0 fichier.php(38): DOMNode->insertBefore(Object(DOMElement), Object(DOMElement)) #1 {main} thrown in fichier.php on line 38
je ne met donc pas les bons arguments dans la fonction, et je ne comprend pas ce qu'il faut que je mette du cou...
ludoOo71 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/05/2008, 20h41   #12
Expert Confirmé
 
Avatar de Séb.
 
Inscription : mars 2005
Messages : 2 827
Détails du profil
Informations personnelles :
Âge : 34
Localisation : France

Informations professionnelles :
Secteur : High Tech - Opérateur de télécommunications

Informations forums :
Inscription : mars 2005
Messages : 2 827
Points : 3 459
Points : 3 459
Essaie ça :

Code :
1
2
3
4
5
6
7
8
9
10
$dom=new DomDocument();
$dom->load('fichier.xml');
$racine=$dom->documentElement;
 
$message=$dom->createElement("p");
$message=$racine->appendChild($message);
 
$div = $dom->createElement('div') ;
// Insère $div avant le 1er fils de $racine
$racine->insertBefore($div, $racine->firstChild) ;
__________________
Un problème exposé clairement est déjà à moitié résolu
Keep It Smart and Simple
Séb. est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/05/2008, 00h09   #13
Invité régulier
 
Étudiant
Inscription : mai 2008
Messages : 10
Détails du profil
Informations personnelles :
Âge : 24

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : mai 2008
Messages : 10
Points : 6
Points : 6
Citation:
Envoyé par Séb. Voir le message
Essaie ça :

Code :
1
2
3
4
 
$div = $dom->createElement('div') ;
// Insère $div avant le 1er fils de $racine
$racine->insertBefore($div, $racine->firstChild) ;
Super !!!

Merci beaucoup ! C'était bien ça qu'il fallait faire !!

@ bientôt!! et merci encore
ludoOo71 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 22h06.


 
 
 
 
Partenaires

Hébergement Web