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

Langage PHP Discussion :

Ajouter un noeud dans un XML existant en php


Sujet :

Langage PHP

  1. #1
    Membre à l'essai
    Homme Profil pro
    Obervateur de nuage 2.3
    Inscrit en
    Mars 2020
    Messages
    46
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 24
    Localisation : Bahamas

    Informations professionnelles :
    Activité : Obervateur de nuage 2.3

    Informations forums :
    Inscription : Mars 2020
    Messages : 46
    Points : 23
    Points
    23
    Par défaut Ajouter un noeud dans un XML existant en php
    Bonjour

    Je m'arrache les cheveux. Je cherche à modifier une date dans mon fichier xml, en fonction d'un retour de formulaire.

    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
    $dom = new DomDocument(); 
    $dom->load("donnees2.xml");
    $searchNode = $dom->getElementsByTagName("ENTITE");
    foreach( $searchNode as $searchNode ){
    	if($searchNode->getAttribute('nom')==$_POST["MAJ_date"]){
    		$xmlDate = $searchNode->getElementsByTagName("DATE");
    		$valueDate = $xmlDate->item(0)->nodeValue;
    		// on crée le nouveau noeud
    		$newdate = $dom->createElement("DATE");
    		// on crée le noeud textuel
    		$date = $dom->createTextNode("21/04/1985");
     
    		$newdate->appendChild($date);
    		$dom->replaceChild($newdate);
     
    		$dom->save('donnees2.xml');
    		echo $valueDate;
    	}
     
    }
    	die();
    Ceci fonctionne, mais il met la date à la fin de mon fichier 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
    17
    18
    19
    20
    21
    22
    	$dom = new DomDocument(); 
    	$dom->load("donnees2.xml");
    	$searchNode = $dom->getElementsByTagName("ENTITE");
    	foreach( $searchNode as $searchNode ){
    		if($searchNode->getAttribute('nom')==$_POST["MAJ_date"]){
    			$xmlDate = $searchNode->getElementsByTagName("DATE");
    			$valueDate = $xmlDate->item(0)->nodeValue;
    			  // on crée le nouveau noeud
    			  $newdate = $dom->createElement("DATE");
    			  // on crée le noeud textuel
    			  $date = $dom->createTextNode("21/04/1985");
     
    			  $newdate->appendChild($date);
     
    			  $dom->appendChild($newdate);
     
    			  $dom->save('donnees2.xml');
    			echo $valueDate;
    		}
     
    	}
    	die();
    Code xml : 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
    <?xml version="1.0" encoding="UTF-8"?>
    <QUESTIONNAIRE>
    			<ENTITE nom="Questions-réponses">
    			<NOM>Questions-réponses</NOM>
    			<SITE>https://www.fff.fr/9-les-arbitres/240-les-lois-du-jeu.html</SITE>
    			<DATE>30/06/2021</DATE>
    			<QUIZZ>
    				<QUIZZ1/>
    			</QUIZZ>
    		</ENTITE>
    		<ENTITE nom="LIGUE DE BRETAGNE">
    			<NOM>LIGUE DE BRETAGNE</NOM>
    			<SITE>https://footbretagne.fff.fr/arbitrage/</SITE>
    			<DATE>08/08/2020</DATE>
    		</ENTITE>
     
    	</QUESTIONNAIRE>

    Merci d'avance

  2. #2
    Responsable Systèmes


    Homme Profil pro
    Gestion de parcs informatique
    Inscrit en
    Août 2011
    Messages
    17 769
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Gestion de parcs informatique
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Août 2011
    Messages : 17 769
    Points : 43 954
    Points
    43 954
    Par défaut
    Plutôt qu'ajouter un noeud avec appendChild, modifie le contenu du nœud d'origine quelque chose comme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $xmlDate->item(0)->nodeValue=[nouvelle date]

  3. #3
    Expert éminent Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 905
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Justicier interdimensionnel

    Informations forums :
    Inscription : Mars 2009
    Messages : 2 905
    Points : 6 694
    Points
    6 694
    Par défaut
    Effectivement il est inutile de créer un nouveau nœud DATE, il suffit de remplacer le nœud texte de l'ancien. Tu peux, comme tu as tenté de le faire, utiliser les méthodes DOMDocument::createTextNode() et DOMNode::replaceChild(), ou bien changer la propriété nodeValue du nœud texte de l'élément DATE, ou encore changer la propriété nodeValue de l'élément DATE comme suggéré par chrtophe, mais attention cette solution (qui marche) n'est pas tout à fait anodine(*).

    Je vais utiliser la seconde solution. En utilisant une requête XPath, on peut arriver directement au nœud texte concerné sans avoir à tester chaque élément ENTITE dans une boucle. Ici le prédicat (la condition entre crochets) vérifie la valeur de l'attribut "nom":

    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
    $dom = new DOMDocument;
    $dom->load('donnees2.xml');
     
    $xp = new DOMXPath($dom);
     
    $new_date = '21/04/1985';
    $nom = 'LIGUE DE BRETAGNE';
     
    $query = '(/*/ENTITE[@nom = "' . $nom . '"]/DATE/text())[1]';
     
    $nodeList = $xp->query($query);
     
    if ( $nodeList->length ) {
        $nodeList->item(0)->nodeValue = $new_date;
    }
     
    echo $dom->saveXML();
    (*) À noter que dans le standard DOM, la propriété nodeValue est censée renvoyer null pour tout ce qui n'est pas un nœud texte, un commentaire, des instructions de traitements (processing instructions) ou un attribut (source).
    En PHP, la valeur de la propriété nodeValue d'un élément est la concaténation des valeurs de ses nœuds textes et de ceux de ses descendants, et si on modifie sa valeur, alors tous ses descendants seront écrasés par un nouveau nœud texte.
    Le fait qu'on puisse en PHP directement accéder à la valeur d'un nœud texte contenu dans un élément à partir de l'élément est une particularité (assez répandue) d'implémentation. Mais si on veut coller au standard, on peut soit changer la valeur du nœud texte (via la propriété nodeValue du nœud texte lui-même), soit remplacer le nœud texte par un nouveau (via replaceChild sur l'élément parent).

  4. #4
    Membre à l'essai
    Homme Profil pro
    Obervateur de nuage 2.3
    Inscrit en
    Mars 2020
    Messages
    46
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 24
    Localisation : Bahamas

    Informations professionnelles :
    Activité : Obervateur de nuage 2.3

    Informations forums :
    Inscription : Mars 2020
    Messages : 46
    Points : 23
    Points
    23
    Par défaut
    Merci à vous deux.

    Je me suis inspiré de chrtophe. CosmoKnacki, je n'ai pas réussi à faire tourner ce que tu m'avais proposé.

    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
     
    	$dom = new DomDocument();
    		//configuration date
    		setlocale(LC_TIME, 'fr_FR');
    		date_default_timezone_set('Europe/Paris');
    		$dateactuel=strftime("%d/%m/%Y");
    		echo ($dateactuel);
     
    		//autre
    		$dom->load("donnees2.xml");
    		$searchNode = $dom->getElementsByTagName("ENTITE");
    		foreach( $searchNode as $searchNode ){
    			if($searchNode->getAttribute('nom')==$_POST["MAJ_date"]){
    				$xmlDate = $searchNode->getElementsByTagName("DATE");
    				$valueDate = $xmlDate->item(0)->nodeValue=$dateactuel;
    				$dom->save('donnees2.xml');
    				echo $valueDate;
    			}
    		}
    		die();

  5. #5
    Expert éminent Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 905
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Justicier interdimensionnel

    Informations forums :
    Inscription : Mars 2009
    Messages : 2 905
    Points : 6 694
    Points
    6 694
    Par défaut
    Citation Envoyé par tGQ7zxFY Voir le message
    CosmoKnacki, je n'ai pas réussi à faire tourner ce que tu m'avais proposé.
    Je serais curieux de voir le problème que tu as rencontré: démo

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

Discussions similaires

  1. [XMLBEANS] Surfer et ajouter des noeuds dans mon XML
    Par akrogames dans le forum APIs
    Réponses: 0
    Dernier message: 05/12/2010, 17h16
  2. Ajouter un noeud à un fichier xml existant
    Par babou54 dans le forum XSL/XSLT/XPATH
    Réponses: 1
    Dernier message: 14/04/2009, 16h54
  3. ajoutter un noeud dans un xml existant
    Par etud_ini dans le forum VB.NET
    Réponses: 1
    Dernier message: 26/10/2008, 20h08
  4. [DOM] Ajouter un noeud dans un XML existant
    Par splifferwolf dans le forum Bibliothèques et frameworks
    Réponses: 11
    Dernier message: 11/02/2008, 16h01
  5. [DOM] PHP5 et XML comment ajouter un noeud dans un noeud précis?
    Par titou250 dans le forum Bibliothèques et frameworks
    Réponses: 12
    Dernier message: 20/04/2006, 21h02

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