Modifier XML

Résolu
cs_guiguizeitzt Messages postés 28 Date d'inscription samedi 3 mai 2008 Statut Membre Dernière intervention 24 mars 2011 - 17 mars 2011 à 11:08
cs_guiguizeitzt Messages postés 28 Date d'inscription samedi 3 mai 2008 Statut Membre Dernière intervention 24 mars 2011 - 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.

16 réponses

krimog Messages postés 1860 Date d'inscription lundi 28 novembre 2005 Statut Membre Dernière intervention 14 février 2015 49
17 mars 2011 à 14:11
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é. -
3
krimog Messages postés 1860 Date d'inscription lundi 28 novembre 2005 Statut Membre Dernière intervention 14 février 2015 49
17 mars 2011 à 15:11
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é. -
3
cs_jopop Messages postés 1540 Date d'inscription lundi 26 mai 2003 Statut Membre Dernière intervention 1 août 2013 12
17 mars 2011 à 11:25
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 ?
0
cs_guiguizeitzt Messages postés 28 Date d'inscription samedi 3 mai 2008 Statut Membre Dernière intervention 24 mars 2011
17 mars 2011 à 11:29
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
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_jopop Messages postés 1540 Date d'inscription lundi 26 mai 2003 Statut Membre Dernière intervention 1 août 2013 12
17 mars 2011 à 11:47
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
0
cs_guiguizeitzt Messages postés 28 Date d'inscription samedi 3 mai 2008 Statut Membre Dernière intervention 24 mars 2011
17 mars 2011 à 11:50
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.
0
cs_jopop Messages postés 1540 Date d'inscription lundi 26 mai 2003 Statut Membre Dernière intervention 1 août 2013 12
17 mars 2011 à 11:57
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 ?
0
cs_guiguizeitzt Messages postés 28 Date d'inscription samedi 3 mai 2008 Statut Membre Dernière intervention 24 mars 2011
17 mars 2011 à 12:02
Tapez le texte de l'url ici.

Le fichier XML est dans le dossier debug.
0
krimog Messages postés 1860 Date d'inscription lundi 28 novembre 2005 Statut Membre Dernière intervention 14 février 2015 49
17 mars 2011 à 12:12
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é. -
0
cs_guiguizeitzt Messages postés 28 Date d'inscription samedi 3 mai 2008 Statut Membre Dernière intervention 24 mars 2011
17 mars 2011 à 12:23
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
0
cs_jopop Messages postés 1540 Date d'inscription lundi 26 mai 2003 Statut Membre Dernière intervention 1 août 2013 12
17 mars 2011 à 12:41
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
0
cs_guiguizeitzt Messages postés 28 Date d'inscription samedi 3 mai 2008 Statut Membre Dernière intervention 24 mars 2011
17 mars 2011 à 14:21
Je vais tenter cette solution
Je te tiens au courant
Merci beaucoup

Guiguizeitzt
0
cs_guiguizeitzt Messages postés 28 Date d'inscription samedi 3 mai 2008 Statut Membre Dernière intervention 24 mars 2011
17 mars 2011 à 14:22
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 ;-)
0
cs_jopop Messages postés 1540 Date d'inscription lundi 26 mai 2003 Statut Membre Dernière intervention 1 août 2013 12
17 mars 2011 à 14:34
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 ?
0
cs_guiguizeitzt Messages postés 28 Date d'inscription samedi 3 mai 2008 Statut Membre Dernière intervention 24 mars 2011
17 mars 2011 à 14:46
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
0
cs_guiguizeitzt Messages postés 28 Date d'inscription samedi 3 mai 2008 Statut Membre Dernière intervention 24 mars 2011
17 mars 2011 à 15:28
C'est ce que je pense faire !
Merci pour ta réponse !
Je pense le créer en utilisant le dataset ...

Guiguizeitzt
0
Rejoignez-nous