IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Bibliothèques et frameworks PHP Discussion :

[SimpleXML] Ajouter un noeud avec addchild en premier


Sujet :

Bibliothèques et frameworks PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé Avatar de Nillak
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    138
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Octobre 2006
    Messages : 138
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 !

  2. #2
    Membre expérimenté

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    6 152
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 6 152
    Par défaut
    SimpleXML n'offre pas ces manipulations, en revanche avec DOM c'est tout à fait possible.

  3. #3
    Membre confirmé Avatar de Nillak
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    138
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Octobre 2006
    Messages : 138
    Par défaut
    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.

  4. #4
    Membre expérimenté

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    6 152
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 6 152
    Par défaut
    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).

  5. #5
    Membre confirmé Avatar de Nillak
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    138
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Octobre 2006
    Messages : 138
    Par défaut
    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 ?

  6. #6
    Membre expérimenté

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    6 152
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 6 152
    Par défaut
    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, ...).

  7. #7
    Membre habitué
    Étudiant
    Inscrit en
    Mai 2008
    Messages
    10
    Détails du profil
    Informations personnelles :
    Âge : 37

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2008
    Messages : 10
    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.

  8. #8
    Membre confirmé Avatar de Nillak
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    138
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Octobre 2006
    Messages : 138
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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

  9. #9
    Membre expérimenté

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    6 152
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 6 152
    Par défaut
    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

  10. #10
    Membre habitué
    Étudiant
    Inscrit en
    Mai 2008
    Messages
    10
    Détails du profil
    Informations personnelles :
    Âge : 37

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2008
    Messages : 10
    Par défaut
    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 :

    $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 :
    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...

  11. #11
    Expert confirmé
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 370
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France

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

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 370
    Billets dans le blog
    17
    Par défaut
    Essaie ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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) ;

Discussions similaires

  1. [SimpleXML] ajouter un noeud avec des attributs
    Par eprevot dans le forum Bibliothèques et frameworks
    Réponses: 2
    Dernier message: 29/09/2011, 11h37
  2. [SimpleXML] Ajout de noeuds et namespaces
    Par amalaxel dans le forum Bibliothèques et frameworks
    Réponses: 3
    Dernier message: 13/01/2008, 16h15
  3. [SimpleXML] problème avec addChild
    Par AgentSmith92 dans le forum Bibliothèques et frameworks
    Réponses: 1
    Dernier message: 15/11/2006, 15h48
  4. Réponses: 4
    Dernier message: 01/06/2006, 15h58
  5. [SimpleXML] XML et parcours des noeuds avec foreach
    Par kult dans le forum Bibliothèques et frameworks
    Réponses: 3
    Dernier message: 15/11/2005, 16h36

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo