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 :

[Débutant] Créer une itération pour une lire un fichier XML


Sujet :

C#

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    100
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2007
    Messages : 100
    Points : 79
    Points
    79
    Par défaut [Débutant] Créer une itération pour une lire un fichier XML
    Bonjour,

    J'ai un soucis avec la lecture de fichier XML. Je souhaiterais automatisé une partie de la lecture d'un fichier XML car on retrouve plusieurs fois les même type de données.

    Voici un exemple de mon fichier XML:
    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
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    <Parameters>
      <Global_Parameters>
        <BorderSizeXLeft>1,6</BorderSizeXLeft>
        <BorderSizeXRight>1,3</BorderSizeXRight>
        <BorderSizeYTop>1,6</BorderSizeYTop>
        <BorderSizeYBottom>0,4</BorderSizeYBottom>
        <BorderOutLengthMin>0,5</BorderOutLengthMin>
        <BorderInLenghtMin>0,5</BorderInLenghtMin>
        <NbOverThresold>0,1</NbOverThresold>
        <NbHorizontalBandsToAnalyze>10</NbHorizontalBandsToAnalyze>
        <NbBandsToBeFound>1</NbBandsToBeFound>
        <NbPixForScan>10</NbPixForScan>
        <RatioDeltaPosXY>0,2</RatioDeltaPosXY>
        <RatioDeltaLengthWH>0,2</RatioDeltaLengthWH>
        <NoiseThreshold>100</NoiseThreshold>
        <BarcodeThreshold>50</BarcodeThreshold>
        <NbDecoding>20</NbDecoding>
        <NbBarcode>1</NbBarcode>
      </Global_Parameters>
      <Bands_Parameters>
        <Number_of_Bands>7</Number_of_Bands>
      </Bands_Parameters>
      <Bande0>
        <Name>C</Name>
        <Pos_X>33,3</Pos_X>
        <Delat_Pos_X>0,05</Delat_Pos_X>
        <Width>0,55</Width>
        <Delat_Width>0,05</Delat_Width>
        <Test_Band>True</Test_Band>
        <Threshold>13</Threshold>
      </Bande0>
      <Bande1>
        <Name>1</Name>
        <Pos_X>6,6</Pos_X>
        <Delat_Pos_X>0,05</Delat_Pos_X>
        <Width>0,55</Width>
        <Delat_Width>0,05</Delat_Width>
        <Test_Band>False</Test_Band>
        <Threshold>13</Threshold>
      </Bande1>
      <Bande2>
        <Name>2</Name>
        <Pos_X>8,9</Pos_X>
        <Delat_Pos_X>0,05</Delat_Pos_X>
        <Width>0,55</Width>
        <Delat_Width>0,05</Delat_Width>
        <Test_Band>False</Test_Band>
        <Threshold>13</Threshold>
      </Bande2>
      <Bande3>
        <Name>3</Name>
        <Pos_X>11,7</Pos_X>
        <Delat_Pos_X>0,05</Delat_Pos_X>
        <Width>0,55</Width>
        <Delat_Width>0,05</Delat_Width>
        <Test_Band>False</Test_Band>
        <Threshold>13</Threshold>
      </Bande3>
      <Bande4>
        <Name>4</Name>
        <Pos_X>14,2</Pos_X>
        <Delat_Pos_X>0,05</Delat_Pos_X>
        <Width>0,55</Width>
        <Delat_Width>0,05</Delat_Width>
        <Test_Band>False</Test_Band>
        <Threshold>13</Threshold>
      </Bande4>
      <Bande5>
        <Name>5</Name>
        <Pos_X>17</Pos_X>
        <Delat_Pos_X>0,05</Delat_Pos_X>
        <Width>0,55</Width>
        <Delat_Width>0,05</Delat_Width>
        <Test_Band>False</Test_Band>
        <Threshold>13</Threshold>
      </Bande5>
      <Bande6>
        <Name>6</Name>
        <Pos_X>22,8</Pos_X>
        <Delat_Pos_X>0,05</Delat_Pos_X>
        <Width>0,55</Width>
        <Delat_Width>0,05</Delat_Width>
        <Test_Band>False</Test_Band>
        <Threshold>13</Threshold>
      </Bande6>
    </Parameters>
    Voici le Code pour lire la première partie "Global_Parameters". Ce code fonctionne bien :
    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
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
     
                System.Globalization.RegionInfo ri = System.Globalization.RegionInfo.CurrentRegion;
                string Comma1;
                string Comma2;
     
                if (ri.Name == "FR")
                {
                    Comma1 = ".";
                    Comma2 = ",";
                }
                else
                {
                    Comma1 = ",";
                    Comma2 = ".";
                }
     
     
                try
                {
                    XmlDocument xmlDoc = new XmlDocument();
                    xmlDoc.Load(@XMLFile);
                    XmlNode Data;
                    XmlElement Elm = xmlDoc.DocumentElement;
                    Doc.SelectNodes
     
                    DataSet dt = new DataSet() ;
                    dt.ReadXml(@XMLFile);
     
                    XmlTextReader reader = new XmlTextReader(@XMLFile);
                    reader.WhitespaceHandling = WhitespaceHandling.None;
     
                    while (reader.Read()) 
    				{
     
                        if (reader.LocalName == "BorderSizeXLeft")
                            BorderSizeXLeft = Double.Parse(reader.ReadString().Trim().Replace(Comma1, Comma2));
                        if (reader.LocalName == "BorderSizeXRight")
                            BorderSizeXRight = Double.Parse(reader.ReadString().Trim().Replace(Comma1, Comma2));
                        if (reader.LocalName == "BorderSizeYTop")
                            BorderSizeYTop = Double.Parse(reader.Value.Trim().Replace(Comma1, Comma2));
                        if (reader.LocalName == "BorderSizeYBottom")
                            BorderSizeYBottom = Double.Parse(reader.Value.Trim().Replace(Comma1, Comma2));
                        if (reader.LocalName == "BorderOutLengthMin")
                            BorderOutLengthMin = Double.Parse(reader.Value.Trim().Replace(Comma1, Comma2));
                        if (reader.LocalName == "BorderInLenghtMin")
                            BorderInLenghtMin = Double.Parse(reader.Value.Trim().Replace(Comma1, Comma2));
                        if (reader.LocalName == "NbOverThresold")
                            NbOverThresold = Double.Parse(reader.Value.Trim().Replace(Comma1, Comma2));
                        if (reader.LocalName == "NbHorizontalBandsToAnalyze")
                            NbHorizontalBandsToAnalyze = Int32.Parse(reader.Value.Trim().Replace(Comma1, Comma2));
                        if (reader.LocalName == "NbBandsToBeFound")
                            NbBandsToBeFound = Int32.Parse(reader.Value.Trim().Replace(Comma1, Comma2));
                        if (reader.LocalName == "NbPixForScan")
                            NbPixForScan = Int32.Parse(reader.Value.Trim().Replace(Comma1, Comma2));
                        if (reader.LocalName == "RatioDeltaPosXY")
                            RatioDeltaPosXY = Double.Parse(reader.Value.Trim().Replace(Comma1, Comma2));
                        if (reader.LocalName == "RatioDeltaLengthWH")
                            RatioDeltaLengthWH = Double.Parse(reader.Value.Trim().Replace(Comma1, Comma2));
                        if (reader.LocalName == "NoiseThreshold")
                            NoiseThreshold = Byte.Parse(reader.Value.Trim().Replace(Comma1, Comma2));
                        if (reader.LocalName == "BarcodeThreshold")
                            BarcodeThreshold = Byte.Parse(reader.Value.Trim().Replace(Comma1, Comma2));
                        if (reader.LocalName == "NbDecoding")
                            NbDecoding = Int32.Parse(reader.Value.Trim().Replace(Comma1, Comma2));
                        if (reader.LocalName == "NbBarcode")
                            NbBarcode = Int32.Parse(reader.Value.Trim().Replace(Comma1, Comma2));
     
                    }
                }
                catch
                {
                    MessageBox.Show("At least one value in xml file is wrong.");
                }
    Pour la seconde partie, j'aimerais créer une itération ou méthode afin d'optimiser la lecture des informations de "Bande". Je me renseigne actuellemenent sur les méthodes XmlDocument, XmlNode... mais suis un peu perdu et noyer par toutes les informations que je trouve.

    Si qq'un à un exemple correspondant à mon problème, ou un avis critique sur la technique à utiliser, ou n'importe quoi pouvant cibler mes recherche, je suis preneur.

    Merci d'avance.

  2. #2
    Nouveau membre du Club
    Inscrit en
    Juillet 2007
    Messages
    35
    Détails du profil
    Informations forums :
    Inscription : Juillet 2007
    Messages : 35
    Points : 29
    Points
    29
    Par défaut
    Bonjour,

    Pourquoi ne pas utiliser une arborescence d'objet avec les tags XmlRoot et XmlElement, et qui représenterait l'arborescence de ton fichier xml ? En utilisant XmlSerializer puis en deserialisant, tu aurais automatiquement une arborescence d'objets Bande, et donc tu pourrais factoriser tes méthodes de conversion de virgule.

    Si je suis pas très claire, dis-le moi, et je t'enverrai un exemple

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    100
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2007
    Messages : 100
    Points : 79
    Points
    79
    Par défaut
    J'avais poser une autre question sur le même sujet et j'ai résolu le problème avec une autre solution.
    Voilà le lien de l'autre post.
    Bonne lecture et merci encore.

    http://www.developpez.net/forums/d78...mal-separator/http://www.developpez.net/forums/d78...mal-separator/

  4. #4
    Membre expérimenté Avatar de ctxnop
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2007
    Messages
    858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2007
    Messages : 858
    Points : 1 732
    Points
    1 732
    Par défaut
    Bonjour

    Citation Envoyé par zicos Voir le message
    J'avais poser une autre question sur le même sujet et j'ai résolu le problème avec une autre solution.
    A première vue, soit tu t'es trompé de lien, soit tu n'a pas compris sa demande. Ça n'a rien a voir avec la conversion string->float/double/decimal.

    Il demande un meilleur moyen de lire des informations XML identiques. En gros, une sorte de collection de noeuds dont les données sont de même format.

    Edit : Je viens seulement de me rendre compte que c'est toi qui a posé la question C'est donc une erreurs de lien ? Car je vois pas le rapport entre itérer dans des noeuds XML et les problèmes de séparateurs décimaux.

    Concernant le fichier XML, je trouve qu'il y a un petit problème. Si chaque noeud "bande" est de même format (type) pourquoi ils ne portent pas le même nom ? Il devraient plus être de la forme <bande id="#">, cela serait plus simple. Mais je suppose que tu ne peux rien y faire ?

    Sinon, ton code ne peut être bon. Es-tu sur d'avoir coller la bonne version ?
    Code csharp : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
                    XmlElement Elm = xmlDoc.DocumentElement;
                    Doc.SelectNodes // Cette ligne ne peux pas être compilable. C'est un appel de méthode mais il manques les parenthèses et les paramètres, en plus il manque le ; final.
     
                    DataSet dt = new DataSet() ;

    Puisque tu as instancier un XmlDocument, je te conseil de t'en servir
    Code csharp : 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
    18
     
    GlobalParameters _gp = new GlobalParameters(); // Une classe que tu devras créer contenant les propriétés correspondantes à tes sous-noeuds.
    Collection<Bande> _bandes = new Collection<Bande>(); // Bande étant une classe que tu devra créer exactement comme GlobalParameter.
     
    XmlDocument xmlDoc = new XmlDocument();
    xmlDoc.Load(@XMLFile);
    XmlElement Elm = xmlDoc.DocumentElement;
     
    // Lit les GlobalsParameters
    _gp.BorderSizeXLeft = Double.Parse(Elm.SelectSingleNode("BorderSizeXLeft").Value); // Je te laisse faire un meilleur parse que ca, car cette solution est sujette à exception.
    /* Idem pour chaque propriétés */
    foreach(XmlElement bnd in Elm.SelectNodes("/Parameters/Bande*"))
    {
        Bande b = new Bande();
        b.Name = bnd.SelectSingleNode("Name").Value;
        /* Idem pour toutes les autres propriétés de bandes */
        _bandes.Add(b);
    }

    Voila, un code comme ca devrait être pas mauvais.
    Sinon, ca pourrait être encore plus simple en utilisant les attributs de sérialisation XML.

    Quelque chose comme ca :
    Code csharp : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
    [XmlRoot()]
    public class Parameters
    {
        private GlobalParameter    _gp;
        private Collection<Bande> _bnds;
     
        public GlobalParameter Global_Parameters
        {
            get { return _gp; }
            set { _gp = value; }
        }
     
    /* Et tu fait pareil pour toutes les propriétés, elle doivent juste être publique */
    }

    Une fois que tu aura tes classes faites comme il faut avec la même structure que ton Xml, tu n'aura plus qu'a désérialiser ton fichier Xml pour obtenir des instances de tes objets. Même besoin de s'ennuyer avec la conversion des float et compagnie. Par contre, il faudra normaliser les noeud bandes pour faire comme je disais, <bande id="#"> ou quelque chose de semblable, car sinon ils ne peuvent être une collection et leurs nombre devra être connu et fini.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 7
    Dernier message: 25/03/2011, 10h52
  2. [XL-2002] Macro de comparaison d'une cellule d'une feuille avec une cellule d'une autre feuille.
    Par steelydan dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 08/09/2010, 12h59
  3. Réponses: 4
    Dernier message: 15/10/2009, 13h33
  4. [XL-2007] Afficher une checkbox dans une feuille si une checkbox d'une autre feuille est cochée
    Par JessieCoutas dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 18/08/2009, 13h35
  5. Recherche une valeur d'une cellule dans une colonne d'une autre feuille
    Par kourria dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 21/06/2007, 13h48

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