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 :

[DOM] Modification d'un titre en conservant les enfants -> ?


Sujet :

Bibliothèques et frameworks PHP

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Août 2009
    Messages
    186
    Détails du profil
    Informations personnelles :
    Âge : 59
    Localisation : France

    Informations forums :
    Inscription : Août 2009
    Messages : 186
    Points : 80
    Points
    80
    Par défaut [DOM] Modification d'un titre en conservant les enfants -> ?
    Bonjour à tous,
    Je suis actuellement confronté à une difficulté que je n'arrive pas à résoudre
    -> Merci par avance si vous avez quelque suggestion à me proposer !

    Voilà l'affaire :
    J'ai un code XML qui se présente selon l'exemple que j'ai mis ci-dessous (XML.xml); code que je modifie à l'aide du code PHP exposé ci-dessous
    -> Seulement, les balises enfant ne sont pas recopiées et donc, n'apparaissent pas dans le fichier XML, après modification !
    -> Sauriez-vous me dire comment arranger cela, SVP ?

    Sinon, comme l'indique le titre de ce topic, ma perspective est, en fait, de changer le nom du titre ("Titre recherché", ici, en l'occurrence) en un autre titre ($Nouveau_titre), mais peut-être cette étape sera à voir dans un 2ème temps, une fois que j'aurai su comment "récupérer" les enfants ?

    Code PHP :

    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
    <?php
     
    $Nouveau_titre = "Nouveau titre";
     
    // On réceptionne l'enregistrement existant	(méthode DOM !)
    $dom=new DomDocument();
    // on respecte la mise en forme initiale
    $dom->preserveWhitespace = false;
     
    $dom->load('XML.xml'); // Nom du fichier XML utilisé pour enregistrer les données
    $xpath = new DOMXPath($dom); /* Variable -> accès à l'arbre DOM via le xpath */
     
    // Recherche du lieu d'insertion
    $requete = '//r[@code="726"]';
    $insertion =  $xpath->query($requete)->item(0);
    // On sauvegarde les enfants
    $enfants =  $xpath->query($requete)->childNodes;
     
    // On crée une balise <r> ayant le nouveau titre (et le même "code" et le même contenu que l'ancien titre)
    $balise_changee = $dom->createElement("r");  
    $balise_changeeT = $dom->createTextNode($enfants);
    $balise_changee->appendChild($balise_changeeT);
    $balise_changee->setAttribute("code", "726");
    // On insère la nouvelle balise <r> à la place de l'ancienne
    $insertion->parentNode->replaceChild($balise_changee, $insertion);
     
    //On sauvegarde le fichier xml dans l'enregistrement existant
    $dom->save('XML.xml');
     
     
    ?>

    Code XML :

    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
    <?xml version="1.0" encoding="UTF-8"?>
    <enregistrements>
    	<r code="123">Titre
    	</r>
    	<r code="726">Titre recherché
    		<regroupement>Titre du regroupement 1
    			<t titre="Bonjour">Texte 1
    			</t>
    		</regroupement>
    		<regroupement>Titre du regroupement 2
    			<t titre="Salut">Texte 2
    			</t>
    		</regroupement>
    	</r>
    </enregistrements>
    ?>

  2. #2
    Membre régulier
    Profil pro
    Inscrit en
    Août 2009
    Messages
    186
    Détails du profil
    Informations personnelles :
    Âge : 59
    Localisation : France

    Informations forums :
    Inscription : Août 2009
    Messages : 186
    Points : 80
    Points
    80
    Par défaut
    Peut-être n'ai-je pas présenté ma question de façon suffisamment "explicite"
    -> Merci de me dire si quelque chose ne vous semble pas clair, dans ma demande !

    A ce propos, si on voulait simplifier davantage, ma question serait :
    "Comment puis-je faire pour récupérer concrètement le contenu (ensemble de balises enfants) qui se trouve entre d'autres balises (balises <r code="726"></r>, ici, en l'occurrence) ?"
    -> Merci pour toute proposition éventuelle !

  3. #3
    Expert éminent
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 099
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

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

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 099
    Points : 8 208
    Points
    8 208
    Billets dans le blog
    17
    Par défaut
    Peux-tu modifier la structure de ton XML ? Si oui il faudrait éviter de mélanger noeuds texte et éléments dans le même élément parent.

    "Comment puis-je faire pour récupérer concrètement le contenu (ensemble de balises enfants) qui se trouve entre d'autres balises (balises <r code="726"></r>, ici, en l'occurrence) ?"
    Avec DOMDocument::saveXML (si j'ai bien compris la question)
    http://fr.php.net/manual/fr/domdocument.savexml.php
    Un problème exposé clairement est déjà à moitié résolu
    Keep It Smart and Simple

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Août 2009
    Messages
    186
    Détails du profil
    Informations personnelles :
    Âge : 59
    Localisation : France

    Informations forums :
    Inscription : Août 2009
    Messages : 186
    Points : 80
    Points
    80
    Par défaut
    Merci Séb.
    Effectivement, je peux adapter mon XML, au niveau du titre des balises <r>
    -> Ce qui me donne :
    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
    <?xml version="1.0" encoding="UTF-8"?>
    <enregistrements>
    	<r code="123" t="Titre">
    	</r>
    	<r code="726" t="Titre recherché">
    		<regroupement>Titre du regroupement 1
    			<t titre="Bonjour">Texte 1
    			</t>
    		</regroupement>
    		<regroupement>Titre du regroupement 2
    			<t titre="Salut">Texte 2
    			</t>
    		</regroupement>
    	</r>
    </enregistrements>
    ?>
    -> Avec cette nouvelle configuration, c'est vrai que je n'ai plus besoin de modifier le noeud texte... Ceci dit, cela me ramène alors à une autre interrogation : "Comment faire pour modifier la valeur du titre recherché (qui se trouve à présent dans l'attribut ?....
    Une idée ?

  5. #5
    Expert éminent
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 099
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

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

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 099
    Points : 8 208
    Points
    8 208
    Billets dans le blog
    17
    Par défaut
    Je vois toujours un texte cotoyer un élément :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <regroupement>Titre du regroupement 1
    			<t titre="Bonjour">Texte 1
    			</t>
    "Comment faire pour modifier la valeur du titre recherché (qui se trouve à présent dans l'attribut
    Avec DOMElement::setAttribute
    Un problème exposé clairement est déjà à moitié résolu
    Keep It Smart and Simple

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Août 2009
    Messages
    186
    Détails du profil
    Informations personnelles :
    Âge : 59
    Localisation : France

    Informations forums :
    Inscription : Août 2009
    Messages : 186
    Points : 80
    Points
    80
    Par défaut
    Effectivement, je peux encore améliorer cela -> Voilà ma nouvelle version, pour le XML :
    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
    <?xml version="1.0" encoding="UTF-8"?>
    <enregistrements>
    	<r code="123" t="Titre">
    	</r>
    	<r code="726" t="Titre recherché">
    		<regroupement t="Titre du regroupement 1">
    			<t titre="Bonjour">Texte 1
    			</t>
    		</regroupement>
    		<regroupement t="Titre du regroupement 2">
    			<t titre="Salut">Texte 2
    			</t>
    		</regroupement>
    	</r>
    </enregistrements>
    Sinon, en modifiant mon code avec "$balise_changee->setAttribute("t", "Nouveau titre");", voilà ce que j'obtiens, au final :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    <?xml version="1.0" encoding="UTF-8"?>
    <enregistrements>
    	<r code="123" t="Titre">
    	</r>
    	<r code="726" t="Nouveau titre"/>
    </enregistrements>
    Me reste plus qu'à trouver un moyen pour insérer mes fameuses balises enfants pour que ça me donne :
    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
    <?xml version="1.0" encoding="UTF-8"?>
    <enregistrements>
    	<r code="123" t="Titre">
    	</r>
    	<r code="726" t="Nouveau titre">
    		<regroupement>Titre du regroupement 1
    			<t titre="Bonjour">Texte 1
    			</t>
    		</regroupement>
    		<regroupement>Titre du regroupement 2
    			<t titre="Salut">Texte 2
    			</t>
    		</regroupement>
    	</r>
    </enregistrements>
    -> Je vais essayer ta proposition : "Avec DOMDocument::saveXML"... Et je reviens !

  7. #7
    Expert éminent
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 099
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

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

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 099
    Points : 8 208
    Points
    8 208
    Billets dans le blog
    17
    Par défaut
    Me reste plus qu'à trouver un moyen pour insérer mes fameuses balises enfants [...] Une idée, à ce propos ?
    Ben tu l'as déjà fait : createElement + appendChild + etc.
    Un problème exposé clairement est déjà à moitié résolu
    Keep It Smart and Simple

  8. #8
    Membre régulier
    Profil pro
    Inscrit en
    Août 2009
    Messages
    186
    Détails du profil
    Informations personnelles :
    Âge : 59
    Localisation : France

    Informations forums :
    Inscription : Août 2009
    Messages : 186
    Points : 80
    Points
    80
    Par défaut
    Oui, je sais, sauf que... ça ne marche pas, de mon coté
    (les enfants ne sont toujours pas "intégrés" !)
    -> Voici mon code, au complet, si ça peut t'aider :
    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
    <?php
     
    $Nouveau_titre = "Nouveau titre";
     
    // On réceptionne l'enregistrement existant	(méthode DOM !)
    $dom=new DomDocument();
    // on respecte la mise en forme initiale
    $dom->preserveWhitespace = false;
     
    $dom->load('XML.xml'); // Nom du fichier XML utilisé pour enregistrer les données
    $xpath = new DOMXPath($dom); /* Variable -> accès à l'arbre DOM via le xpath */
     
    // Recherche du lieu d'insertion
    $requete = '//r[@code="726"]';
    $insertion =  $xpath->query($requete)->item(0);
    // On sauvegarde les enfants
    $enfants =  $xpath->query($requete)->childNodes;
    $VariableEnfants = $doc->saveXML($enfants);
    // On crée une balise <r> ayant le nouveau titre (et le même "code" et le même contenu que l'ancien titre)
    $balise_changee = $dom->createElement("r");  
    $balise_changeeT = $dom->createTextNode($VariableEnfants);
    $balise_changee->appendChild($balise_changeeT);
    $balise_changee->setAttribute("code", "726");
    $balise_changee->setAttribute("t", "Nouveau titre");
    // On insère la nouvelle balise <r> à la place de l'ancienne
    $insertion->parentNode->replaceChild($balise_changee, $insertion);
     
    //On sauvegarde le fichier xml dans l'enregistrement existant
    $dom->save('XML.xml');
     
     
    ?>

  9. #9
    Membre régulier
    Profil pro
    Inscrit en
    Août 2009
    Messages
    186
    Détails du profil
    Informations personnelles :
    Âge : 59
    Localisation : France

    Informations forums :
    Inscription : Août 2009
    Messages : 186
    Points : 80
    Points
    80
    Par défaut
    ... Avec, en prime, l'erreur suivante qui apparait :
    Fatal error: Call to a member function saveXML() on a non-object in /homez.59/souffle/www/Site/1-Trouver_les_ressources/Ressources/ENREGISTREMENTS_XML/Multimedia/TEST/TEST.php on line 18
    -> Une idée pour résoudre cela ?

  10. #10
    Membre régulier
    Profil pro
    Inscrit en
    Août 2009
    Messages
    186
    Détails du profil
    Informations personnelles :
    Âge : 59
    Localisation : France

    Informations forums :
    Inscription : Août 2009
    Messages : 186
    Points : 80
    Points
    80
    Par défaut
    Euh, oui, bon, en fait, c'est moi qui ai fait une bourde :
    J'ai mis : $VariableEnfants = $doc->saveXML($enfants);
    au lieu de : $VariableEnfants = $dom->saveXML($enfants);
    -> C'est arrangé et... voilà ce qui s'affiche, à présent :
    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
    <?xml version="1.0" encoding="UTF-8"?>
    <enregistrements>
    	<r code="123" t="Titre">
    	</r>
    	<r code="726" t="Nouveau titre">&lt;?xml version="1.0" encoding="UTF-8"?&gt;
    &lt;enregistrements&gt;
    	&lt;r code="123" t="Titre"&gt;
    	&lt;/r&gt;
    	&lt;r code="726" t="Nouveau titre"&gt;
    		&lt;regroupement t="Titre du regroupement 1"&gt;
    			&lt;t titre="Bonjour"&gt;Texte 1
    			&lt;/t&gt;
    		&lt;/regroupement&gt;
    		&lt;regroupement t="Titre du regroupement 2"&gt;
    			&lt;t titre="Salut"&gt;Texte 2
    			&lt;/t&gt;
    		&lt;/regroupement&gt;
    	&lt;/r&gt;
    &lt;/enregistrements&gt;
    </r>
    </enregistrements>
    Bon, ben, peut mieux faire, comme qui dirait !
    Une idée ?

  11. #11
    Membre éprouvé Avatar de vorace
    Homme Profil pro
    Développeur
    Inscrit en
    Août 2010
    Messages
    573
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur

    Informations forums :
    Inscription : Août 2010
    Messages : 573
    Points : 915
    Points
    915
    Par défaut
    Pourquoi pas un simple "setAttribute" pour modifier le titre de l'élément plutôt que de sauvegarder ses enfants, de recréer un élément identique à l'ancien au titre près pour lui réinsérer les enfants sauvegardé...si j'ai bien compris ce que tu veux faire ?!
    Développeur informatique contrarié...

  12. #12
    Membre régulier
    Profil pro
    Inscrit en
    Août 2009
    Messages
    186
    Détails du profil
    Informations personnelles :
    Âge : 59
    Localisation : France

    Informations forums :
    Inscription : Août 2009
    Messages : 186
    Points : 80
    Points
    80
    Par défaut
    Hello vorace,
    Oui, effectivement, ça se tient complètement !
    A vrai dire, j'ai du foirer quelques tests, auparavant, car j'en avais conclu, un peu trop hâtivement que ce genre de raccourci n'était pas possible...
    Merci de m'aider à rectifier... Je viens de faire le test (voir ci-dessous) et...
    Wouuu, ça y est, c'est reparti... Ca maaarche !

    Grand Merci à toi !
    (Du coup, c'est "Résolu"... Ouf !)

    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
    <?php
     
    $Nouveau_titre = "Nouveau titre";
     
    // On réceptionne l'enregistrement existant	(méthode DOM !)
    $dom=new DomDocument();
    // on respecte la mise en forme initiale
    $dom->preserveWhitespace = false;
     
    $dom->load('XML.xml'); // Nom du fichier XML utilisé pour enregistrer les données
    $xpath = new DOMXPath($dom); /* Variable -> accès à l'arbre DOM via le xpath */
     
    // Recherche du lieu d'insertion
    $requete = '//r[@code="726"]';
    $insertion =  $xpath->query($requete)->item(0);
     
    $insertion->setAttribute("t", "Nouveau titre");
     
    //On sauvegarde le fichier xml dans l'enregistrement existant
    $dom->save('XML.xml');
     
    ?>

  13. #13
    Expert éminent
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 099
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

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

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 099
    Points : 8 208
    Points
    8 208
    Billets dans le blog
    17
    Par défaut
    Citation Envoyé par vorace Voir le message
    Pourquoi pas un simple "setAttribute" pour modifier le titre de l'élément plutôt que de sauvegarder ses enfants, de recréer un élément identique à l'ancien au titre près pour lui réinsérer les enfants sauvegardé...si j'ai bien compris ce que tu veux faire ?!
    Pourquoi faire simple quand on peut faire compliqué ?
    Un problème exposé clairement est déjà à moitié résolu
    Keep It Smart and Simple

  14. #14
    Membre régulier
    Profil pro
    Inscrit en
    Août 2009
    Messages
    186
    Détails du profil
    Informations personnelles :
    Âge : 59
    Localisation : France

    Informations forums :
    Inscription : Août 2009
    Messages : 186
    Points : 80
    Points
    80
    Par défaut
    Ouaih, Seb, pour le commentaire, j'y avais pensé mais, à vrai dire, j'avais trouvé ça tellement "déplacé" que je ne l'ai pas mis... Après, c'est à chacun de voir, hein !
    N'empêche que vorace m'aura super bien aidé à me simplifier la vie... Ca ne mérite pas un "Ola", ça ?

  15. #15
    Membre régulier
    Profil pro
    Inscrit en
    Août 2009
    Messages
    186
    Détails du profil
    Informations personnelles :
    Âge : 59
    Localisation : France

    Informations forums :
    Inscription : Août 2009
    Messages : 186
    Points : 80
    Points
    80
    Par défaut
    Euh, mille excuses, SEB, quand-même... Vis à vis de ta réflexion, je crois que j'ai pris un peu la mouche ! Et puis, c'est vrai que mon approche, au départ était plutôt "pas simple" du tout !

    Du coup, grand Merci à toi aussi car , non seulement, en me ramenant à un simple "setAttribute", tu as contribué à me simplifier mon bignz du moment, mais j'avais aussi un autre sujet d'embrouille, dernièrement, qui, justement, celui-là, était ciblé sur "Comment modifier un attribut en PHP" et, du coup, sans le vouloir, tu m'as donné ainsi, à travers ton approche... et celle de vorace de résoudre également ce deuxième sujet...

    Bonne continuation !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [XL-2010] Comment conserver les modifications faites sur un UserForm
    Par TSAFACK-M dans le forum Macros et VBA Excel
    Réponses: 11
    Dernier message: 19/09/2016, 21h15
  2. Réponses: 10
    Dernier message: 08/04/2015, 16h47
  3. Scroll sur un tableau en conservant les titres a leur position initiale
    Par top_eagle dans le forum Balisage (X)HTML et validation W3C
    Réponses: 7
    Dernier message: 17/02/2009, 15h10
  4. [DOM] Trie tableau html en conservant les events onclick
    Par Orbiplanax dans le forum Général JavaScript
    Réponses: 6
    Dernier message: 09/12/2008, 16h04
  5. Réponses: 4
    Dernier message: 12/05/2007, 23h24

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