IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C# Discussion :

Compter le nombre de section dans un xml ?


Sujet :

C#

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 30
    Points : 16
    Points
    16
    Par défaut Compter le nombre de section dans un xml ?
    Bonjour à tous,

    cela fait plusieurs jours maintenant que je me sers de mon ami google pour trouver un bon moyen d'utiliser des xml avec c# ayant peu de notions dans ce language (genre les messages box et les savedialog...merci mon "super" prof d'info !)
    Bref je vous explique je veux faire une appli avec un fichier config, donc j'ai fait la méthode classique qu'on trouve dans google, a savoir joindre un fichier de config a l'appli appeler app.config, faire la référence au System.Configuration et je l'ai rempli de cette manière :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    <configuration>
    	<configSections>
    		<section name="Usine1" type="System.Configuration.SingleTagSectionHandler"/>
    		<section name="Usine2" type="System.Configuration.SingleTagSectionHandler"/>
    	</configSections>
    		<Usine1 nom="XXX" code="9800" debutip="192.168.20." finip="60"/>
    		<Usine2 nom="XXX" code="9801" debutip="192.168.21." finip="60"/>
    </configuration>
    où le nombre d'usine peut changer bien entendu...
    j'ai besoin de savoir s'il est possible de récuperer le nombre de section name dans ce xml (je parle d'un truc propre )
    ainsi je pourrais faire une boucle avec un i, allant de 1 a X ou X est le num de ma derniere usine, me permettant de récupérer les valeurs des noeuds nom et code pour chaque usine...
    et mon prog s'adaptant ainsi, si de nouvelles usines apparaissent sans modif du code.
    pour finir chaque section["nom"] et section["code"] de chaque usine vont se retrouver dans deux combobox, une pour les noms, une pour les codes...

    Voila j'espere avoir été assez clair, je sais pas si ma démarche est la bonne mais comme je vous le dis je suis nouveau dev et j'ai pas forcément la bonne reflexion, peut etre qu'un autre code xml serait plus adéquate ? je suis ouvert a toutes vos pistes ! Merci d'avance

  2. #2
    Expert confirmé
    Avatar de ced600
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Août 2006
    Messages
    3 364
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Août 2006
    Messages : 3 364
    Points : 4 061
    Points
    4 061
    Par défaut
    Avec AppSettings ne récupères tu pas toutes tes sections dans une liste, collection, ou autre ?

    Si c'est le cas il te suffirait de faire un foreach dessus et tu la parcourerais dans son enssemble et accéderais à tous les éléments.
    Pourquoi faire compliqué lorsque l'on peut faire encore plus compliqué.

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 30
    Points : 16
    Points
    16
    Par défaut
    salut et merci de ta réponse

    accéder aux éléments n'est pas un problème j'ai fait un new hashtable de la section qui m'interesse et je recupere ensuite la valeur des noeuds en fonction de ma section. par exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
           for (int i = 1; i = ???? (); i++)
                    {
                        Hashtable section = (Hashtable)ConfigurationManager.GetSection("Usine"+i);
                        comboBox1.Items.Add(section["nom"]);
                    }
    voila en gros j'ai déja mon idée de code, sauf que je ne sais pas comment définir la derniere valeur de i qui doit etre égale au nombre de "<Section name=" présent dans mon fichier xml...
    la je suis sur msdn et apparemment avec un NameVallueCollection on peut faire un .count de nos valeurs...seulement ce qui m'interesse c'est pas le nombre de valeur de noeuds, mais le nombre de SECTION...
    c'est plus clair ?

  4. #4
    Expert confirmé
    Avatar de ced600
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Août 2006
    Messages
    3 364
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Août 2006
    Messages : 3 364
    Points : 4 061
    Points
    4 061
    Par défaut
    essaye un truc comme cela :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    NameValueCollection appSettings = ConfigurationManager.AppSettings;
    string[] key= new String[appSettings.Count];
    appSettings.CopyTo( key, 0 );
    foreach ( string value in key )
    {
    .....
    }
    AppSettings:
    ConfigurationManager.AppSettings, propriété
    Remarque : cette propriété est nouvelle dans le .NET Framework version 2.0.

    Obtient les données AppSettingsSection pour la configuration par défaut de l'application actuelle.
    Valeur de la propriété
    Retourne un objet NameValueCollection contenant le contenu de l'objet AppSettingsSection pour la configuration par défaut de l'application actuelle.
    NameValueCollection :
    Représente une collection de clés String et de valeurs String associées accessibles soit par la clé, soit par l'index.
    De façon générlae j'ai trouvé tout cela ici :
    http://msdn2.microsoft.com/fr-fr/lib...er(VS.80).aspx
    Pourquoi faire compliqué lorsque l'on peut faire encore plus compliqué.

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 30
    Points : 16
    Points
    16
    Par défaut
    yep ced encore merci une fois de plus mais j'ai aussi vu cet article
    et de ce que j'en ai compris, NameVallueCollection te sort les pairs "valeur/clé" et donc je pense que faire un .count me retournera 4 (pour les paires nom,code,debutip,finip) ou peut etre 8 car 4*2 sections...
    bref je n'arrive pas a l'utiliser pour que le count sortent simplement le nombre de section name crée. j'esperais trouver un truc dans les getsection qui se rapproche mais que néni alors finalement je viens de faireu ntruc pas très propre a savoir :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    int i=1;
                    while ( (i < 99) && ((Hashtable)ConfigurationManager.GetSection("Usine"+i)!=null))                
                    {
                        Hashtable section = (Hashtable)ConfigurationManager.GetSection("Usine"+i);
                        comboBox1.Items.Add(section["nom"]);
                        i++;
                    }
    voila comme on aura 99 usines le jour où le soleil ne brillera plus je me dis que je prends pas trop de risques...et ma deuxieme condition fait que je ne perds pas de temps a tester des valeurs inutiles...
    Merci quand même

  6. #6
    Membre régulier
    Profil pro
    Développeur informatique
    Inscrit en
    Août 2006
    Messages
    163
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2006
    Messages : 163
    Points : 112
    Points
    112
    Par défaut
    Peut être que je vais dire une connerie car le contexte me semble plutot obscure mais pourquoi n'utilise-tu pas le XPath ?

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 30
    Points : 16
    Points
    16
    Par défaut
    Hey ! tout simplement parce que a part avoir lu "xpath" sur qq forum donc je sais que ca existe, je ne me suis jamais penché complètement dessus car je ne savais pas si il contenait ma solution, vu que ca a l'air costaud...j'essaie d'assimiler les choses petit à petit
    Mais merci du conseil, depuis que j'ai lu ton post, j'ai fait une recherche google et mis deux liens en favoris, quand je serais motivé, jme tapperais les deux tutos et peut-être que j'y trouverai une facon différente de faire

    en attendant pour info quand je fais dans mon code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    { MessageBox.Show(section.Keys.Count.ToString()); }
    ou section = hashtable d'une section nommé "usineX" (voir mon xml tt en haut) le résultat est 4... et je pense qu'avec la solution de ced j'obtiendrais le meme résultat.

  8. #8
    Expert confirmé
    Avatar de ced600
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Août 2006
    Messages
    3 364
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Août 2006
    Messages : 3 364
    Points : 4 061
    Points
    4 061
    Par défaut
    En fait surtout le truc est de repéré l'objet qui contient une collection de tes sections et ensuite d'utiliser foreach.

    Je ne sais pas si tu connais foreach mais il te permet de parcourir une collection sans en connaitre la taille.

    Et cela m'etonnerais qu'il n'y ai nulle part une liste de tes sections.

    Faut fouillé un peu plus ConfigurationManager je pense.

    Tu peux aussi te refaire ton fichier XML et le parser toi même.

    Personnellement plutot que reutiliser une roue carré, pour ne pas reproduire un outil utilisant le même concept, je préfère refaire une roue mais cette fois-ci ronde. Voir triangulaire si ma route est plus adapté à ce genre de roue.
    Pourquoi faire compliqué lorsque l'on peut faire encore plus compliqué.

  9. #9
    Membre régulier
    Profil pro
    Développeur informatique
    Inscrit en
    Août 2006
    Messages
    163
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2006
    Messages : 163
    Points : 112
    Points
    112
    Par défaut
    Ok ben écoute c'est très simple le XPath, en 1h maxi tu c naviguer dans tes fichier XML > ça ressemble à un explorateur
    \MonNoeud\MonNoeud\

    si tu met 2 \\ c'est que tu les veux tous genre
    \\configuration\configSections\section
    > là t'as tout tes noeud section qui ont \configuration\configSections\ en noeuds parents

    si tu fait \@Nom tu récupère l'attribut nom
    si tu fait [@Nom = "toto"] ben tu filtre genre
    \\configuration\configSection\section[@Nom="toto"]
    ou
    \\configuration\configSection[@monAttributQuiestunnombre > 9]\section

    bref tu utilise la classe XmlDocument et tu fait des SelectSingleNode ou SelectsNodes

    ça te revoi des XmlNode ou des XmlNodeList et là t'as se que tu t'embete pas tu fait des .Count ou des SetAttribute ou alors des GetAttribute Etc....
    ns : System.XML

    Si tu te débrouille bien tu peut faire des trucs vraiment incroyable avec le XPath (y'a quelque fonction simple et très puissante pour trouver les noeuds que tu souhaite)
    Voilà maintenant avec ça je penses que t'as toute les bases pour utiliser le XPath et arrêter de t'embeter en en écrivant un minimum.
    ++

  10. #10
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 30
    Points : 16
    Points
    16
    Par défaut
    Un énorme merci GSXRider (vive les motos hein )

    voici ce que donne mon code depuis ton aide :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
     XmlDocument xmlDoc = new XmlDocument();
                xmlDoc.Load(Application.StartupPath + "\\App.config");
                string xpathExpression = "//configuration/Usine";
                //chargement du fichier de config + selection des noeuds qui nous interessent
                // ici tous les noeuds se trouvant après "usine" sont ajouter a la liste (clé + valeur)
     
                XmlNode finip = xmlDoc.SelectSingleNode(xpathExpression+"/@finip");
                textBox1.Text = finip.Value;
                // rempli la case fin de l'ip
                //@finip = filtre selectionnant uniquement les valeurs des noeuds "finip"
     
                XmlNodeList noms = xmlDoc.SelectNodes(xpathExpression);
                foreach (XmlElement test in noms)
                {
                    comboBox1.Items.Add(test.GetAttribute("nom"));
                    comboBox2.Items.Add(test.GetAttribute("code"));
                }
    et mon xml est aussi simplifié car je n'ai plus besoin de la section "SECTION"

    bref merci bcp et si qqchose vous dérange dans mon nouveau code je suis tout ouie ^^
    maintenant il faut que je trouve comment lier mes 2 combobox par contre... appremment il y a des attribution d'id planqué avec le xmlnodelist si j'en crois msdn... ? doit avoir une fonction get merci encore

Discussions similaires

  1. compter nombre de noeud dans un XML
    Par geek21 dans le forum Flex
    Réponses: 36
    Dernier message: 14/08/2009, 15h46
  2. Réponses: 4
    Dernier message: 01/02/2008, 13h39
  3. Réponses: 6
    Dernier message: 11/02/2005, 06h41
  4. [SQL][ACCESS]Compter le nombres d'enregistrement dans deux..
    Par pc152 dans le forum Décisions SGBD
    Réponses: 1
    Dernier message: 05/06/2004, 12h30
  5. Réponses: 2
    Dernier message: 02/03/2004, 19h38

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo