|
[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-BERTINMessage 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" 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 POUR i = 4 À 8 UnNoeud..Nom = "balise"+i Ajoute(balise1..NoeudFils,UnNoeud) FIN 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 |
| |
| |
| | | |
|
| | | | |
| | |
|