Précédent   Forum des professionnels en informatique > PHP > Bibliothèques et frameworks > XML > DOM
DOM Forum d'entraide pour l'extension DOM permettant de manipuler des documents XML en PHP 5 (approche DOM). Avant de poster -> tutoriels 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 27/12/2011, 21h03   #1
Membre du Club
 
Inscription : août 2009
Messages : 177
Détails du profil
Informations personnelles :
Âge : 47
Localisation : France

Informations forums :
Inscription : août 2009
Messages : 177
Points : 46
Points : 46
Par défaut 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 :
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 :
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>
?>
souffle56 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/12/2011, 20h46   #2
Membre du Club
 
Inscription : août 2009
Messages : 177
Détails du profil
Informations personnelles :
Âge : 47
Localisation : France

Informations forums :
Inscription : août 2009
Messages : 177
Points : 46
Points : 46
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 !
souffle56 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/12/2011, 01h00   #3
Expert Confirmé
 
Avatar de Séb.
 
Inscription : mars 2005
Messages : 2 823
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 823
Points : 3 454
Points : 3 454
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.

Citation:
"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
Séb. est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/12/2011, 19h53   #4
Membre du Club
 
Inscription : août 2009
Messages : 177
Détails du profil
Informations personnelles :
Âge : 47
Localisation : France

Informations forums :
Inscription : août 2009
Messages : 177
Points : 46
Points : 46
Merci Séb.
Effectivement, je peux adapter mon XML, au niveau du titre des balises <r>
-> Ce qui me donne :
Code :
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 ?
souffle56 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/12/2011, 20h32   #5
Expert Confirmé
 
Avatar de Séb.
 
Inscription : mars 2005
Messages : 2 823
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 823
Points : 3 454
Points : 3 454
Je vois toujours un texte cotoyer un élément :

Code :
1
2
3
<regroupement>Titre du regroupement 1
			<t titre="Bonjour">Texte 1
			</t>
Citation:
"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
Séb. est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/12/2011, 20h52   #6
Membre du Club
 
Inscription : août 2009
Messages : 177
Détails du profil
Informations personnelles :
Âge : 47
Localisation : France

Informations forums :
Inscription : août 2009
Messages : 177
Points : 46
Points : 46
Effectivement, je peux encore améliorer cela -> Voilà ma nouvelle version, pour le XML :
Code :
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 :
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 :
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 !
souffle56 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/12/2011, 21h51   #7
Expert Confirmé
 
Avatar de Séb.
 
Inscription : mars 2005
Messages : 2 823
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 823
Points : 3 454
Points : 3 454
Citation:
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
Séb. est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/12/2011, 22h00   #8
Membre du Club
 
Inscription : août 2009
Messages : 177
Détails du profil
Informations personnelles :
Âge : 47
Localisation : France

Informations forums :
Inscription : août 2009
Messages : 177
Points : 46
Points : 46
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 :
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');
 
 
?>
souffle56 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/12/2011, 22h04   #9
Membre du Club
 
Inscription : août 2009
Messages : 177
Détails du profil
Informations personnelles :
Âge : 47
Localisation : France

Informations forums :
Inscription : août 2009
Messages : 177
Points : 46
Points : 46
... Avec, en prime, l'erreur suivante qui apparait :
Citation:
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 ?
souffle56 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/12/2011, 22h10   #10
Membre du Club
 
Inscription : août 2009
Messages : 177
Détails du profil
Informations personnelles :
Âge : 47
Localisation : France

Informations forums :
Inscription : août 2009
Messages : 177
Points : 46
Points : 46
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 :
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 ?
souffle56 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/12/2011, 22h13   #11
Membre émérite
 
Avatar de vorace
 
Homme
Développeur
Inscription : août 2010
Messages : 587
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 : 587
Points : 861
Points : 861
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é...
vorace est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 29/12/2011, 22h33   #12
Membre du Club
 
Inscription : août 2009
Messages : 177
Détails du profil
Informations personnelles :
Âge : 47
Localisation : France

Informations forums :
Inscription : août 2009
Messages : 177
Points : 46
Points : 46
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 :
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');
 
?>
souffle56 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/12/2011, 22h35   #13
Expert Confirmé
 
Avatar de Séb.
 
Inscription : mars 2005
Messages : 2 823
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 823
Points : 3 454
Points : 3 454
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
Séb. est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/12/2011, 22h41   #14
Membre du Club
 
Inscription : août 2009
Messages : 177
Détails du profil
Informations personnelles :
Âge : 47
Localisation : France

Informations forums :
Inscription : août 2009
Messages : 177
Points : 46
Points : 46
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 ?
souffle56 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/12/2011, 23h32   #15
Membre du Club
 
Inscription : août 2009
Messages : 177
Détails du profil
Informations personnelles :
Âge : 47
Localisation : France

Informations forums :
Inscription : août 2009
Messages : 177
Points : 46
Points : 46
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 !
souffle56 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 19h08.


 
 
 
 
Partenaires

Hébergement Web