XmlTextReader / ListView [Résolu]

Messages postés
37
Date d'inscription
jeudi 17 mai 2007
Statut
Membre
Dernière intervention
26 décembre 2010
- - Dernière réponse : mastereur
Messages postés
37
Date d'inscription
jeudi 17 mai 2007
Statut
Membre
Dernière intervention
26 décembre 2010
- 20 avril 2009 à 09:02
Bonjour,

Je souhaite charger un bout de XML vers une listview à 3 colonne (nom valeur description)
j'arrive à presque tt charger (vf image=> ligne en rouge) sauf l'option dans le layout.
Je n'arrive pas à trouver d'où ça peut venir et je suis presque sur que c'est quelque chose de tout bête.

Merci d'avance

un bout de xml:

     
     
      <maxSizeRollBackups value="0" />
      <maximumFileSize value="5MB" />
      <layout type="log4net.Layout.PatternLayout,log4net">
             <conversionPattern value="%d\t%t\t%-5p\t%c\t%L\t%m%n" />
      </layout>

Et le code:
string parentName, childName, childValue;
XmlTextReader fichierXml = new XmlTextReader(fichier);
XmlDocument doc = new XmlDocument();
doc.Load(fichier);
            while (fichierXml.Read())
            {
                #region appender
                /* on a trouvé un nouveau appender
                 */
                if (fichierXml.LocalName == "appender")
                {
                    parentName = fichierXml.GetAttribute("name");
                    /* ici la fonction 'VerifItemSalrClientLog4net' cherche si l'appender
                     * est présent dans le fichier de configuration.
                     * si non, on l'ajoute est il sera mis en rouge
                     */
                    if (!VerifItemSalrClientLog4net(parentName))
                    {
                        childValue = fichierXml.GetAttribute("type");
                        item[0] = parentName;
                        item[1] = childValue;
                        item[2] = "appender:" + parentName +
                                       "|type";
                        liste.Items.Add(new ListViewItem(item));

                        // on avance dans le appender
                        while ((fichierXml.Read()) && (fichierXml.LocalName != "appender"))
                        {
                            if (fichierXml.LocalName == "param")
                            {
                                childName = fichierXml.GetAttribute("name");
                                childValue = fichierXml.GetAttribute("value");
                                MessageBox.Show(childValue);
                                item[0] = parentName + " " + childName;
                                item[1] = childValue;
                                item[2] = "appender:" + parentName +
                                               "|param:"   + childName;
                                liste.Items.Add(new ListViewItem(item));
                            }
                            else if (fichierXml.LocalName == "maxSizeRollBackups" ||
                                     fichierXml.LocalName == "maximumFileSize")
                            {
                                childName = fichierXml.LocalName;
                                childValue = fichierXml.GetAttribute("value");
                                item[0] = parentName + " " + childName;
                                item[1] = childValue;
                                item[2] = "appender:" + parentName +
                                               "|" + childName;
                                liste.Items.Add(new ListViewItem(item));
                            }
                            else if (fichierXml.LocalName == "layout")
                            {
                                #region new layout
                                childValue = fichierXml.GetAttribute("type");
                                item[0] = parentName + " layout";
                                item[1] = childValue;
                                item[2] = "appender:" + parentName +
                                               "|layout";
                                liste.Items.Add(new ListViewItem(item));

                                /* on avance dans le layout
                                 * en fonction du parametre de conversion pattern,
                                 * on fait une action
                                 */
                                fichierXml.Read();
                                if (fichierXml.LocalName == "param")
                                {
                                    childValue = fichierXml.GetAttribute("value");
                                    item[0] = parentName + "layout ConversionPattern";
                                    item[1] = childValue;
                                    item[2] = "appender:" + parentName +
                                                   "|layout|param";
                                    liste.Items.Add(new ListViewItem(item));
                                }
                                else if (fichierXml.LocalName == "conversionPattern")
                                {
                                    childValue = fichierXml.GetAttribute("value");
                                    item[0] = parentName + "layout conversionPattern";
                                    item[1] = childValue;
                                    item[2] = "appender:" + parentName +
                                                   "|layout|conversionPattern";
                                    liste.Items.Add(new ListViewItem(item));
                                }
                                #endregion new layout
                            }

                        }//end while appender
                    }
                }
                #endregion appender
            }//end while read
Afficher la suite 

2 réponses

Meilleure réponse
Messages postés
834
Date d'inscription
samedi 15 novembre 2008
Statut
Membre
Dernière intervention
14 janvier 2017
26
3
Merci
Bonjour,

L'instruction Read sur un XmlTextReader est très basic, et par défaut elle retourne aussi les caracteres de fin de ligne entre 2 balises (on est en mode texte).
D'autre méthodes du XmlTextReader sont plus perspicasses.

Dans ton code, tous les "Read" sont dans une boucle "While" avec une série de tests pour savoir ce que tu as lu, les caracteres de fin de lignes ne te dérangent donc pas car tu les ignores simplement.
mais pour la balise <conversionPattern> tu fais un seul "Read", qui doit retourner un fin de ligne!!
il faudrait que tu fasses un 2eme read, ou une boucle while comme pour les autres.
(mets un point d'arret après le Read et regarde le contenu de fichierXml.LocalName)

Ou encore plus simple, tu peux parametrer les XmlTextReader pour qu'il ignore lui-même ces fin de lignes:
Ajoute ça apres l'initialisation de ton XmlTextReader:
   fichierXml.WhitespaceHandling = WhitespaceHandling.None;

tu peux aussi enlever la déclaration du XmlDocument et son ouverture, qui ne servent a rien.

Bon code
C# is amazing, enjoy it!

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 190 internautes nous ont dit merci ce mois-ci

Commenter la réponse de cs_Robert33
Messages postés
37
Date d'inscription
jeudi 17 mai 2007
Statut
Membre
Dernière intervention
26 décembre 2010
0
Merci
Merci de ta réponse.
à la place du seul read, j'ai mis un while. Car sans, j'avais une ligne de trop ;
je suppose que ça lisais </layout> et donc me rajoutai une ligne de trop.
Commenter la réponse de mastereur