Modifier XML [Résolu]

cs_guiguizeitzt 28 Messages postés samedi 3 mai 2008Date d'inscription 24 mars 2011 Dernière intervention - 17 mars 2011 à 11:08 - Dernière réponse : cs_guiguizeitzt 28 Messages postés samedi 3 mai 2008Date d'inscription 24 mars 2011 Dernière intervention
- 17 mars 2011 à 15:28
Bonjour,

J'ai un fichier XML du genre :
  <elements>
    <silo>
      valeur1


      valeur1


    </silo>
    <silo>
      valeur2


      valeur2


    </silo>
    <silo>
      valeur3


      valeur3


    </silo>
    <silo>
      valeur4


      valeur4


    </silo>
    <silo>
      valeur5


      valeur5


    </silo>
    <vanne>
      valeur1


      valeur1


    </vanne>
    <vanne>
      valeur2


      valeur2


    </vanne>
    <vanne>
      valeur3


      valeur3


    </vanne>
    <vanne>
      valeur4


      valeur4


    </vanne>
    <vanne>
      valeur5


      valeur5


    </vanne>

On remarque que les éléments y sont plusieurs fois.
Ce que je voudrais faire c'est en fonction d'une valeur d'un combobox ( du genre 1, 2, 3, 4 ou 5), afficher soit 1, 2 ,3, etc fois l'élément en question dans le fichier XML.

Je sais pas si j'ai été assez clair dans mes explications.
Si quelqu'un a une solution ...

D'avance merci.
Afficher la suite 

Votre réponse

16 réponses

Meilleure réponse
krimog 1863 Messages postés lundi 28 novembre 2005Date d'inscription 14 février 2015 Dernière intervention - 17 mars 2011 à 14:11
3
Merci
Salut

Alors le plus simple pour manipuler du XML, c'est d'utiliser LINQ-2-XML.

// Ajoute le using pour linq en haut de ton fichier
using System.Xml.Linq;

// 1) Tu charges tout ton fichier XML en mémoire
XDocument doc = XDocument.Load("xmlconfiguration.xml");

// 2) Tu récupères le noeud elements
XElement noeudElements = doc.Descendants("elements").First();

// 3) Tu récupères les sous-noeuds de elements. Le .ToList() permet de dupliquer
// les valeurs de la liste, ce qui permet qu'elles ne soient pas effacées quand on
// supprimera les noeuds.
var listeNoeuds = (from noeud in noeudElements.Elements() select noeud.Name.ToString()).Distinct().ToList();

// 4) On supprime les noeuds dans elements
noeudElements.Elements().Remove();

// 5) On rajoute nb fois un noeud pour chaque ancien noeud
foreach (string nomNoeud in listeNoeuds)
{
    for (int i = 1; i <= nb; i++)
    {
        XElement nouveauNoeud = new XElement(nomNoeud);
        // C'est ici que tu définiras les valeurs
        nouveauNoeud.Add(new XElement("positionx", "valeur" + i));
        nouveauNoeud.Add(new XElement("positiony", "valeur" + i));
        // On ajoute les nouveaux noeuds au noeud elements
        noeudElements.Add(nouveauNoeud);
    }
}

// 6) On sauvegarde le fichier
doc.Save("xmlconfiguration.xml");


Krimog : while (!(succeed = try())) ;
- Nous ne sommes pas des décodeurs ambulants. Le style SMS est prohibé. -

Merci krimog 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 124 internautes ce mois-ci

Commenter la réponse de krimog
Meilleure réponse
krimog 1863 Messages postés lundi 28 novembre 2005Date d'inscription 14 février 2015 Dernière intervention - 17 mars 2011 à 15:11
3
Merci
Il est beaucoup plus facile de recréer un fichier que d'en modifier un.

Krimog : while (!(succeed = try())) ;
- Nous ne sommes pas des décodeurs ambulants. Le style SMS est prohibé. -

Merci krimog 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 124 internautes ce mois-ci

Commenter la réponse de krimog
cs_jopop 1540 Messages postés lundi 26 mai 2003Date d'inscription 1 août 2013 Dernière intervention - 17 mars 2011 à 11:25
0
Merci
Salut,

Qu'entends- tu entends par "afficher n fois les éléments dans le fichier XML" ? Tu veux générer un XML avec n noeuds identiques ? Tu veux extraire les n premiers noeuds d'un XML existant ?
Commenter la réponse de cs_jopop
cs_guiguizeitzt 28 Messages postés samedi 3 mai 2008Date d'inscription 24 mars 2011 Dernière intervention - 17 mars 2011 à 11:29
0
Merci
J'ai deja le XML existant mais il est féfini avec le nombre maximal d'éléments.
Donc je souhaite en enlever si la valeur que je choisie est différentes de la valeur max possible.

Guiguizeitzt
Commenter la réponse de cs_guiguizeitzt
cs_jopop 1540 Messages postés lundi 26 mai 2003Date d'inscription 1 août 2013 Dernière intervention - 17 mars 2011 à 11:47
0
Merci
Tu veux donc : lire le XML > supprimer des lignes > écraser le XML, j'ai bon ?

Si oui, il faut regarder du côté de System.Xml :
- utiliser XmlDocument.Load(string) pour lire le XML,
- parcourir les noeuds à l'aide de XmlDocument.ChildNodes pour supprimer ceux en trop,
- et enfin sauvegarder le résultat grâce à XmlDocument.Save(string).

Bon code
Commenter la réponse de cs_jopop
cs_guiguizeitzt 28 Messages postés samedi 3 mai 2008Date d'inscription 24 mars 2011 Dernière intervention - 17 mars 2011 à 11:50
0
Merci
Ca ne va pas me supprimer le reste de mon fichier ??
je veux dire les parties que je ne modifie pas ne vont pas être écraser ???
Parce que j'ai déja tester cette méthode et ça m'a écraser la fin du fichier que je souhaite garder.

Pour plus de précision j'ai poster un code source de mon projet.
Commenter la réponse de cs_guiguizeitzt
cs_jopop 1540 Messages postés lundi 26 mai 2003Date d'inscription 1 août 2013 Dernière intervention - 17 mars 2011 à 11:57
0
Merci
Je vois pas encore où est le souci avec cette méthode, je veux donc bien voir ta source. Pourrais-tu m'en donner le lien stp ?
Commenter la réponse de cs_jopop
cs_guiguizeitzt 28 Messages postés samedi 3 mai 2008Date d'inscription 24 mars 2011 Dernière intervention - 17 mars 2011 à 12:02
0
Merci
Tapez le texte de l'url ici.

Le fichier XML est dans le dossier debug.
Commenter la réponse de cs_guiguizeitzt
krimog 1863 Messages postés lundi 28 novembre 2005Date d'inscription 14 février 2015 Dernière intervention - 17 mars 2011 à 12:12
0
Merci
Salut

Je dois t'avouer que même en regardant ton projet, je n'ai strictement rien compris à ton problème.

D'après ce que j'arrive plus ou moins à décoder, tu souhaites que si dans ta combobox tu choisis 1, tu aies un fichier XML de ce type :
  <elements>
    <silo>
      valeur1


      valeur1


    </silo>
    <vanne>
      valeur1


      valeur1


    </vanne>
  </elements>

et si tu choisis 3, tu aies un fichier XML de ce type :
  <elements>
    <silo>
      valeur1


      valeur1


    </silo>
    <silo>
      valeur2


      valeur2


    </silo>
    <silo>
      valeur3


      valeur3


    </silo>
    <vanne>
      valeur1


      valeur1


    </vanne>
    <vanne>
      valeur2


      valeur2


    </vanne>
    <vanne>
      valeur3


      valeur3


    </vanne>
  </elements>

Est-ce bien ça ? Si oui, comment comptes-tu choisir les valeurs à mettre (à moins que tu ne veuilles vraiment marquer "valeur1") ? Et as-tu une liste des éléments (silo, vanne) ? N'y a-t-il que ces deux là ?

Krimog : while (!(succeed = try())) ;
- Nous ne sommes pas des décodeurs ambulants. Le style SMS est prohibé. -
Commenter la réponse de krimog
cs_guiguizeitzt 28 Messages postés samedi 3 mai 2008Date d'inscription 24 mars 2011 Dernière intervention - 17 mars 2011 à 12:23
0
Merci
C'est exactement ça.
Les valeurs a mettre seront des valeurs en dur.
Tu peux trouver le fichier XML dans le dossier du projet ...

Merci d'avoir répondu
Commenter la réponse de cs_guiguizeitzt
cs_jopop 1540 Messages postés lundi 26 mai 2003Date d'inscription 1 août 2013 Dernière intervention - 17 mars 2011 à 12:41
0
Merci
oki, je viens de voir ton code ;)

Je remarque qu'il faut que chaque type de noeuds doit être quantifié par l'utilisateur pour monter ton XML, du coup ne serait-il pas plus judicieux de le créer from scratch, plutôt que de tenter de modifier celui qui te sert de modèle ? Je veux bien tenter de voir comment remanier ton XML existant, mais dans ton cas ça ne me parait pas nécessaire.

Et tu n'utilises pas réellement le XmlDocument, tu load la source puis le laisse de côté pour utiliser un DataSet.

Rien à voir : tu pourrais disabler ton bouton "OK" et l'enabler uniquement lorsque toutes les ComboBoxes ont une valeur valide

PS :
je me rappelle de ton topic sur la progressbar ^^
moi j'aurais pas fait comac :p
Commenter la réponse de cs_jopop
cs_guiguizeitzt 28 Messages postés samedi 3 mai 2008Date d'inscription 24 mars 2011 Dernière intervention - 17 mars 2011 à 14:21
0
Merci
Je vais tenter cette solution
Je te tiens au courant
Merci beaucoup

Guiguizeitzt
Commenter la réponse de cs_guiguizeitzt
cs_guiguizeitzt 28 Messages postés samedi 3 mai 2008Date d'inscription 24 mars 2011 Dernière intervention - 17 mars 2011 à 14:22
0
Merci
Jopop :
pour le bouton OK c'est ce que je vais faire mais je voulais faire les plus grosses parties avant. Et pour ma progresse tout fonctionne quand même ;-)
Commenter la réponse de cs_guiguizeitzt
cs_jopop 1540 Messages postés lundi 26 mai 2003Date d'inscription 1 août 2013 Dernière intervention - 17 mars 2011 à 14:34
0
Merci
Avi ça marche bien, juste que ma solution évitait de parcourir tous les contrôles ;)

Et sinon, pour le fait de construire le XML en entier plutôt que modifier un existant, qu'est-ce qui ne collerait pas ?
Commenter la réponse de cs_jopop
cs_guiguizeitzt 28 Messages postés samedi 3 mai 2008Date d'inscription 24 mars 2011 Dernière intervention - 17 mars 2011 à 14:46
0
Merci
Et bien je crois que j'ai trouver une solution parce qu'en fait il faut que je garde la fin du fichier XML.
Mais j'ai trouver que je pouvais créer la fin du fichier et ensuite créer des balises en plus ...

Guiguizeitzt
Commenter la réponse de cs_guiguizeitzt
cs_guiguizeitzt 28 Messages postés samedi 3 mai 2008Date d'inscription 24 mars 2011 Dernière intervention - 17 mars 2011 à 15:28
0
Merci
C'est ce que je pense faire !
Merci pour ta réponse !
Je pense le créer en utilisant le dataset ...

Guiguizeitzt
Commenter la réponse de cs_guiguizeitzt

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.