PC SOFT

PROFESSIONAL NEWSGROUPS
WINDEVWEBDEV and WINDEV Mobile

Home → WINDEV (earlier versions) → [WD21] Modifier valeur XML
[WD21] Modifier valeur XML
Started by [WD21] Modifier valeur XML, Jul., 27 2018 9:52 AM - 22 replies
Posted on July, 27 2018 - 9:52 AM
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
Registered member
281 messages
Popularité : +24 (26 votes)
Posted on July, 27 2018 - 11:55 AM
Bonjour,

Les attributs se manipulent comme ceci :

monXML = XMLOuvre(XMLNomEmplacement,depuisFichier)
POUR TOUT xmlNoeudFils de xmlNoeudPere sur Info
xmlNoeudFils:Attribut..Valeur = NouvelleValeur
FIN
Posted on July, 27 2018 - 12:00 PM
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é
Posted on July, 27 2018 - 2:06 PM
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é ...
Registered member
281 messages
Popularité : +24 (26 votes)
Posted on July, 27 2018 - 4:34 PM
Ah c’est une balise et non un attribut...

Trace(MonNoeud.balise2..Texte)
MonNoeud.balise2..Texte = "mavaleur"
Posted on July, 27 2018 - 4:43 PM
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)
Registered member
281 messages
Popularité : +24 (26 votes)
Posted on July, 27 2018 - 5:11 PM
XMLSauve(MonDocXML, "C:\MonfichierXML.xml")

La fonction ErreurDetectee renvoi vrai si il y a une erreur
Posted on July, 27 2018 - 5:23 PM
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 ...
Registered member
2,571 messages
Popularité : +222 (260 votes)
Posted on July, 30 2018 - 9:33 AM
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 modified, July, 30 2018 - 9:37 AM
Posted on August, 01 2018 - 8:51 AM
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
Registered member
281 messages
Popularité : +24 (26 votes)
Posted on August, 01 2018 - 11:09 AM
Tu sauvegarde dans quel repertoire pour info stp ?
Posted on August, 01 2018 - 11:16 AM
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)
Registered member
281 messages
Popularité : +24 (26 votes)
Posted on August, 01 2018 - 1:10 PM
Mets nous ton code en entier car là, je ne vois pas ce qui peut clocher à part un problème d'UAC peut-être...
Registered member
2,571 messages
Popularité : +222 (260 votes)
Posted on August, 01 2018 - 2:57 PM
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
Posted on August, 01 2018 - 4:19 PM
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 ...
Registered member
2,571 messages
Popularité : +222 (260 votes)
Posted on August, 02 2018 - 2:54 PM
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
Posted on August, 02 2018 - 4:55 PM
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
Registered member
2,571 messages
Popularité : +222 (260 votes)
Posted on August, 02 2018 - 6:14 PM
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
Registered member
281 messages
Popularité : +24 (26 votes)
Posted on August, 02 2018 - 6:47 PM
SI PAS xmlNoeudFils.balise4..Existe ALORS
xmlNoeudFils.balise4 = ""
FIN


cela crée une balise vide
Registered member
2,571 messages
Popularité : +222 (260 votes)
Posted on August, 03 2018 - 8:35 AM
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
Posted on August, 09 2018 - 11:42 AM
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
Posted on August, 14 2018 - 1:53 PM
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.
Registered member
2,571 messages
Popularité : +222 (260 votes)
Posted on August, 17 2018 - 11:46 AM
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