XmlWriter et retour-chariot

Messages postés
135
Date d'inscription
vendredi 1 septembre 2006
Statut
Membre
Dernière intervention
8 mai 2019
-
Bonjour,

Je sérialize un Treview en fichier XML avec un objet XmlWriter. Tout va bien, si ce n'est que mon fichier n'est constitué que d'une ligne unique.

Après avoir écumé le web à ce sujet, j'ai toujours trouvé la même réponse : il faut mettre la propriété Indent à true.

J'ai trouvé plusieurs variantes, soit avec "New XmlWriter(fichier)", soit avec "XmlWriter.Create(fichier, settings)".

Dans les deux cas, le passage de Indent à true ne modifie rien, et mon fichier n'a toujours qu'une ligne (en plus de la ligne de déclaration <?xml...)

je mets ci-dessous l'image du Treeview concerné et le code des deux fonctions exécutant l'export.

Qu'est-ce que j'ai raté ?


        public static bool Serialize(TreeNodeCollection Nodes, string FileName)
        {
            File.Delete(FileName);      // Pour éviter des problèmes si le nouveau texte est plus court
            XmlDocument xDoc = new XmlDocument();
            XmlWriterSettings Settings = new XmlWriterSettings();
            Settings.Encoding = Encoding.UTF8;
            Settings.Indent = true;
            //Settings.IndentChars = "\t";
            XmlWriter XmlFile = XmlWriter.Create(FileName, Settings);
            try
            {
                XmlElement root = xDoc.DocumentElement;
                foreach (TreeNode Nd in Nodes)
                    AddXmlNode(xDoc, root, Nd);

                xDoc.WriteTo(XmlFile);
                XmlFile.Close();
            }
            catch (Exception ex)
            {
                ErrorHandling.TraiteErreur(ex);
                return false;
            }
            finally { xDoc = null; if (XmlFile != null) XmlFile.Close(); }
            return true;
        }

        //-------------------------------------------------------------------------------------------------------------
        // Ajout d'un noeud XML dans le document xDoc à partir du Noeud de TreeView Nd
        private static bool AddXmlNode(XmlDocument xDoc, XmlElement xNd, TreeNode tNd)
        {
            XmlElement Elmnt = null;
            try
            {
                // Création du noeud et ajout au document
                string ElmtName = XmlConvert.EncodeLocalName(tNd.Text);
                Elmnt = xDoc.CreateElement(ElmtName);
                if (xNd == null)
                    xDoc.AppendChild(Elmnt);
                else
                    xNd.AppendChild(Elmnt);

                Elmnt.InnerText = tNd.Text;
                DirClass Dir = tNd.Tag as DirClass;
                if(Dir != null)
                {
                    XmlAttribute Attr;
                    Attr = xDoc.CreateAttribute("TotalNum");
                    Attr.Value = Dir.FileNum.ToString();
                    Elmnt.Attributes.Append(Attr);

                    Attr = xDoc.CreateAttribute("TotalSize");
                    Attr.Value = Dir.Size.ToString();
                    Elmnt.Attributes.Append(Attr);

                    foreach (string DirName in Dir.SubDirs)
                    {
                        XmlElement Xelmt = xDoc.CreateElement("SubDir");
                        Attr = xDoc.CreateAttribute("Name");
                        Attr.Value = DirName;
                        Xelmt.Attributes.Append(Attr);
                        Elmnt.AppendChild(Xelmt);
                    }

                    foreach(FileClass File in Dir.Files)
                    {
                        XmlElement Xelmt = xDoc.CreateElement("File");
                        Attr = xDoc.CreateAttribute("Name");
                        Attr.Value = File.Name;
                        Xelmt.Attributes.Append(Attr);
                        Attr = xDoc.CreateAttribute("Size");
                        Attr.Value = File.Size.ToString();
                        Xelmt.Attributes.Append(Attr);
                        Elmnt.AppendChild(Xelmt);
                    }
                }


            }
            catch (Exception ex) { ErrorHandling.TraiteErreur(ex, "Noeud : " + tNd.FullPath); return false; }

            // Traitement des noeuds enfants
            foreach (TreeNode sNd in tNd.Nodes)
                if (!AddXmlNode(xDoc, Elmnt, sNd))
                    return false;
            return true;
        }

    }
Afficher la suite 

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.