XmlWriter et retour-chariot

Messages postés
171
Date d'inscription
vendredi 1 septembre 2006
Statut
Membre
Dernière intervention
14 novembre 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