PC SOFT

FORUMS PROFESSIONNELS
WINDEVWEBDEV et WINDEV Mobile

Accueil → WINDEV (précédentes versions) → [WD21] Modifier valeur XML
[WD21] Modifier valeur XML
Débuté par [WD21] Modifier valeur XML, 27 juil. 2018 09:52 - 22 réponses
Posté le 27 juillet 2018 - 09:52
Bonjour,
Je parcours un XML avec des POURTOUT
Lors de ce parcours, je lis les différentes valeurs et j'aimerais les modifier à la volée au fur et a mesure de la lecture pour les remplacer par une autre valeur.
J'ai essayé différentes manipulations, mais je n'ai jamais réussi à faire en sorte de modifier la valeur et de l'enregistrer.

Voici l'idée du code :
Code :
monXML = XMLOuvre(XMLNomEmplacement,depuisFichier)
POUR TOUT xmlNoeudFils de xmlNoeudPere sur Info
xmlNoeudFils.Attribut = NouvelleValeur
FIN


Pourriez vous m'aider sur le sujet ?

Cordialement, uFo
Membre enregistré
281 messages
Popularité : +24 (26 votes)
Posté le 27 juillet 2018 - 11:55
Bonjour,

Les attributs se manipulent comme ceci :

monXML = XMLOuvre(XMLNomEmplacement,depuisFichier)
POUR TOUT xmlNoeudFils de xmlNoeudPere sur Info
xmlNoeudFils:Attribut..Valeur = NouvelleValeur
FIN
Posté le 27 juillet 2018 - 12:00
Est ce qu'il faut faire une sauvegarde après pour enregistrer toutes les modifications ?
Car j'essaie de faire un XMLSauve(monXML,CheminDeMonXML)
Mais sans succès, à l'ouverture du XML celui ci n'a pas été modifié
Posté le 27 juillet 2018 - 14:06
Genre voici un exemple de XML :
<?xml version="1.0" encoding="windows-1252"?>
<balise1>
<balise2>25101718495</balise2>
</balise1>
Je parcours le XML, je sais lire ma valeur, mais si je veux la modifier en faisant
XmlNoeudBalise1:balise2 = manouvelle valeur
J'ai déjà un avertissement me disant que l’élément n''existe pas dans le type importé ...
Membre enregistré
281 messages
Popularité : +24 (26 votes)
Posté le 27 juillet 2018 - 16:34
Ah c’est une balise et non un attribut...

Trace(MonNoeud.balise2..Texte)
MonNoeud.balise2..Texte = "mavaleur"
Posté le 27 juillet 2018 - 16:43
je dois surement louper quelque chose...
Car la valeur ne s'enregistre toujours pas dans mon fichier final ...
j'ai testé avec :
XMLSauve(monXML)

et
sSourceXML est une chaîne = XMLConstruitChaîne(monXML)
fSauveTexte(XMLNomEmplacement,monXML)
Membre enregistré
281 messages
Popularité : +24 (26 votes)
Posté le 27 juillet 2018 - 17:11
XMLSauve(MonDocXML, "C:\MonfichierXML.xml")

La fonction ErreurDetectee renvoi vrai si il y a une erreur
Posté le 27 juillet 2018 - 17:23
Je n'ai aucune erreur détectée et ca ne s'enregistre quand même pas ...
Quand je trace le champs XML après avoir modifié sa valeur, j'ai bien la nouvelle valeur, mais je ne l'ai jamais dans mon fichier final à la fin quand je vais l'ouvrir après le process ...
Membre enregistré
2 568 messages
Popularité : +222 (260 votes)
Posté le 30 juillet 2018 - 09:33
Bonjour,

Voilà un bout de code à adapter à ta situation. J'ai importé le xml dans le projet.
monXML est un xmlDocument <Description="modele"> = XMLOuvre("C:\Mes Projets\test\modele.xml")

POUR TOUT xmlNoeudFils de monXML.balise1 SUR balise2
xmlNoeudFils..Texte = "valeur1"
FIN
XMLSauve(monXML,fRepExe()+"\test.xml",XMLMiseEnForme)


Résultat du xml sauvé
<?xml version="1.0" encoding="windows-1252"?>
<balise1>
<balise2>valeur1</balise2>
<balise2>valeur1</balise2>
<balise2>valeur1</balise2>
<balise2>valeur1</balise2>
<balise3>ne pas modifier</balise3>
<balise2>valeur1</balise2>
</balise1>


Fichier xml de départ

<?xml version="1.0" encoding="windows-1252"?>
<balise1>
<balise2>25101718495</balise2>
<balise2>tes1</balise2>
<balise2>test2</balise2>
<balise2>test3</balise2>
<balise3>ne pas modifier</balise3>
<balise2>test4</balise2>
</balise1>


--
Cordialement,

Philippe SAINT-BERTIN
Message modifié, 30 juillet 2018 - 09:37
Posté le 01 août 2018 - 08:51
Bonjour,
Merci pour ta réponse. Effectivement, ton code fonctionne très bien.
Mais quand j'essaie de l'implémenter dans le code existant, je n'arrive toujours pas a sauvegarder le XML modifié.
j'ai beau essayé de l'enregistrer dans "un nouveau fichier" ou bien même le ré enregistrer sur "lui même", impossible, la modification n'est jamais sauvegardée.
La seule différence avec ton code que j'ai, c'est que pour pouvoir parcourir le XML, j'ai intégré le XSD dans le projet et non le XML (car le XML varie a chaque réception).
Je ne comprends vraiment pas pourquoi la sauvegarde ne se fait pas...
Surtout que quand je trace la valeur que je veux modifier avant et après la modification, j'ai bien la bonne information qui s'affiche, mais impossible de la sauver, je ne comprends vraiment pas pourquoi.
Cordialement, uFo
Membre enregistré
281 messages
Popularité : +24 (26 votes)
Posté le 01 août 2018 - 11:09
Tu sauvegarde dans quel repertoire pour info stp ?
Posté le 01 août 2018 - 11:16
Dans le même répertoire ou je vais chercher mon fichier XML original (un dossier qui se trouve sur mon bureau windows enfin dans un sous dossier du dossier)
Membre enregistré
281 messages
Popularité : +24 (26 votes)
Posté le 01 août 2018 - 13:10
Mets nous ton code en entier car là, je ne vois pas ce qui peut clocher à part un problème d'UAC peut-être...
Membre enregistré
2 568 messages
Popularité : +222 (260 votes)
Posté le 01 août 2018 - 14:57
Essaye de l'enregistrer dans c:\Temp par exemple pour vérifier que ce n'est pas u problème d'un répertoire non accessible.

--
Cordialement,

Philippe SAINT-BERTIN
Posté le 01 août 2018 - 16:19
J'ai trouvé le pourquoi du comment, mais j'arrive pas à l'expliquer ...
Au départ, j'ai déclaré mes différents noeud comme ca :
xmlNoeudBalise1 est un xmlNoeud, Description = "XmlTest.Balise1" // Noeud principal

Pour les parcourir avec un POUR TOUT.

En ne déclarant pas mes noeuds et en parcourant directement le XML avec la déclaration de la description sur l'xml, ca fonctionne ...

Je ne comprends pas pourquoi en déclarant mes noeuds et en passant par cette déclaration cela ne fonctionne pas ...
Membre enregistré
2 568 messages
Popularité : +222 (260 votes)
Posté le 02 août 2018 - 14:54
Ton XML ne respecte pas le XSD à mon avis.

Essaye comme ça pour vérifier
XMLSauve(monXML,fRepExe()+"\test.xml",xvSansValidation)


--
Cordialement,

Philippe SAINT-BERTIN
Posté le 02 août 2018 - 16:55
Même sans la validation avec la déclaration des noeuds pour les parcourir, ca n'enregistre pas la valeur ...
Mais sans la déclaration des noeuds et en parcourant le XML directement, aucun soucis à l'enregistrement ...
Tant que j'y suis, j'ai une autre petite question concernant la création de balise ...
Imaginons un XML du genre

<?xml version="1.0" encoding="windows-1252"?>
<balise1>
<balise2>25101718495</balise2>
<balise2>tes1</balise2>
<balise2>test2</balise2>
<balise2>test3</balise2>
<balise3>ne pas modifier</balise3>
<balise2>test4</balise2>
</balise1>


Imaginons que dans mon parcours, je test un
xmlNoeudFils.balise4..Existe

Ca va me renvoyer Faux, vu qu'elle n'existe pas ... Mais si je veux la créer dans mon parcours après avoir detecté qu'elle n'existait pas, comment puis je faire ?
J'ai essayé avec divers fonction de windev concernant les XML mais je ne suis jamais arrivé à mes fins :/

Merci d'avance
Membre enregistré
2 568 messages
Popularité : +222 (260 votes)
Posté le 02 août 2018 - 18:14
Au temps pour moi je n'avais pas lu ton message précédent. Peux tu poster le code complet car je pense avoir compris mais j'ai besoin de m'assurer de ce qui est écrit.

--
Cordialement,

Philippe SAINT-BERTIN
Membre enregistré
281 messages
Popularité : +24 (26 votes)
Posté le 02 août 2018 - 18:47
SI PAS xmlNoeudFils.balise4..Existe ALORS
xmlNoeudFils.balise4 = ""
FIN


cela crée une balise vide
Membre enregistré
2 568 messages
Popularité : +222 (260 votes)
Posté le 03 août 2018 - 08:35
Chez moi ce code fonctionne. Etant donné que ton problème ne survient que lorsque tu utilises un xsd, je suppose doncqu'il ne valide pas celui-ci, mais je ne peux pas en être sûr. Vérifie dans le xsd qu'il n'y a pas une balise obligatoire qui ne serait pas dans ton xml.

monXML est un xmlDocument <Description="modele"> = XMLOuvre("C:\Users\Philippe\Documents\PC Soft\Mes Projets\Mon_Projet\Exe\modele.xml")
balise1 est un xmlNoeud,Description="modele.balise1"
balise2 est un xmlNoeud,Description="modele.balise1.balise2"
UnNoeud est un xmlNoeud

POUR TOUT balise1 de monXML
POUR TOUT balise2 de balise1 SUR balise2
SI balise2..Nom = "balise2" ALORS
balise2..Texte = "valeur"
FIN
FIN

//balises vide
POUR i = 4 À 8
UnNoeud..Nom = "balise"+i
Ajoute(balise1..NoeudFils,UnNoeud)
FIN

// balises remplies
POUR i = 9 À 12
UnNoeud..Nom = "balise"+i
UnNoeud..Texte = "balise"+i
Ajoute(balise1..NoeudFils,UnNoeud)
FIN
FIN
XMLSauve(monXML,fRepExe()+"\test.xml",XMLMiseEnForme)


Resultat
<?xml version="1.0" encoding="windows-1252"?>
<balise1>
<balise2>valeur</balise2>
<balise2>valeur</balise2>
<balise2>valeur</balise2>
<balise2>valeur</balise2>
<balise3>ne pas modifier</balise3>
<balise2>valeur</balise2>
<balise4/>
<balise5/>
<balise6/>
<balise7/>
<balise8/>
<balise9>balise9</balise9>
<balise10>balise10</balise10>
<balise11>balise11</balise11>
<balise12>balise12</balise12>
</balise1>


--
Cordialement,

Philippe SAINT-BERTIN
Posté le 09 août 2018 - 11:42
Effectivement, il y a des chances que ce soit au niveau de la validation que réside le soucis.
Mais avec votre aide et vos explications, je suis arrivé au résultat que j'attendais.
merci de votre aide, cordialement, uFo
Posté le 14 août 2018 - 13:53
Bonjour,
j'ai une dernière petite question concernant la création de balise en XML ...
Voici l'idée:
je parcours les différents noeuds pour tester si une balise existe ou non avec un ..Existe ca fonctionne bien.
Je réussi à créer ma balise avec un MonNoeud.MaBalise = MaValeur et ca fonctionne bien aussi ...
par contre, la ou j'ai un soucis, c'est lors de l'enregistrement avec la validation grace au XSD ... En effet, la balise que je crée ce met en dernier dans le noeud, ce qui est logique ... Existe t'il un moyen de créer cette balise à l'endroit exacte ou celle ci devrait se trouver (du à la définition dans le XSD) ?
Merci d'avance.
Membre enregistré
2 568 messages
Popularité : +222 (260 votes)
Posté le 17 août 2018 - 11:46
Bonjour,

En utilisant ma méthode, en lieu et place de
Ajoute(balise1..NoeudFils,UnNoeud)


tu mets
Insère(balise1..NoeudFils,IndiceInsertion,UnNoeud)


--
Cordialement,

Philippe SAINT-BERTIN