XML with treeView



  • Abend Leute ...

    Ich nutze ein treeView zum bearbeiten eines XML Dokuments. Ich lasse den nutzer via Button ein neues Dokument erstellen via:

    private void neuesDokumentErstellenToolStripMenuItem_Click(object sender, EventArgs e)
            {
                //Es soll ein neues leeres Dokument erstellt werden
                System.Int16 zähler = 0;
    
                //Um sicher zu gehen das keine gleichnamigen Dokumente entstehen - Dokumentname immer um "1" erhöhen (Dokument(1) usw.)
                while (ListComboBox.Items.Contains("neues Dokument" + zähler.ToString()) == true) zähler++;
    
                //neuen TreeView mit Main erstellen
                TreeView t = new TreeView();
                t.Nodes.Add ("Main");
    
                IDiskIO.exportToXml(t,"D://" + AuswahlComboBox.Text + "//neues Dokument" + zähler.ToString() + ".xml", progressBar);
    
                //Dateien aktualisieren
                LoadDataIntoList();        
            }
    

    ... und versuche gleich den Stammknoten <Main> einzufügen, und die Datei dann via

    //Streamwriter vorbereiten
                    StreamWriter sr = new StreamWriter(dateiname, false, System.Text.Encoding.UTF8);
                    sr.WriteLine("<?xml version=\"1.0\" encoding=\"utf-8\" ?>");
    
                    //Nodes des Treeviews nummerieren, durchlaufen und schreiben
                    IEnumerator ie = tv.Nodes.GetEnumerator();
    
                    //fortschrittanzeige aktualisieren (maximum)
                    fortschritt.Maximum = tv.Nodes.Count;
    
                    if (ie.MoveNext())
                    {
                        TreeNode tn = (TreeNode)ie.Current;
                        sr.WriteLine("<" + tn.Text + ">");
                        parseNode(tn, sr);
    
                        //für den Fortschritt
                        fortschritt.PerformStep();
                    }
    
                    //Streamwriter schließen
                    sr.Close();
    
                    return true;
                }
    
                catch (Exception e)
                {
                    MessageBox.Show("Fehler in DiskIO: exportToXML --> " + e.Message);
                    return false;
                }                     
            }
    
            private void parseNode(TreeNode tn, StreamWriter sr)
            {
                //static Methode zum beibehalten der Variablen Werte
    
                //Knoten nummerieren
                IEnumerator ie = tn.Nodes.GetEnumerator();
    
                //Buffer
                string parentnode = "";
    
                //Buffer mit NodeName füttern
                parentnode = tn.Text;
    
                //Knoten durchlaufen
                while (ie.MoveNext())
                {
                    TreeNode ctn = (TreeNode)ie.Current;
    
                    if (ctn.GetNodeCount(true) == 0)
                    {
                        sr.Write(ctn.Text);
                    }
                    else
                    {
                        sr.Write("<" + ctn.Text + ">");
                    }
                    if (ctn.GetNodeCount(true) > 0)
                    {
                        parseNode(ctn,sr);
                    }
                }
    
                sr.Write("</" + parentnode + ">");
                sr.WriteLine("");
            }
    

    ... gleich zu speichern.

    Das Ergebnis sieht dann so aus:

    <?xml version="1.0" encoding="utf-8" ?>
    <<Main></Main>>
    <Definition>Definition</Definition>
    </<Main></Main>>

    Sollte aber so aussehen:

    <?xml version="1.0" encoding="utf-8" ?>
    <Main>
    <Definition>Definition</Definition>
    </Main>

    Habt ihr ne Idee dazu ?



  • shaun1981 schrieb:

    Habt ihr ne Idee dazu ?

    Ja, schau dir mal System.Xml an...

    1. XmlWriter FTW
    2. Alternative XmlDocument-Klasse und deren Save()-Funktion.


  • Ich Tendiere eher zu dem XDocument.

    z.B in der langform

    XElement mainElement = new XElement("Main");
    XElement definitionElement = new XElement("Definition", "Definition");
    mainElement.Add(definitionElement);
    XDocument document = new XDocument(new XDeclaration("1.0", "utf-8", "no"), mainElement);
    document.Save(myFileName)
    

    ;

    oder direkt

    var doc = new XDocument(new XDeclaration("1.0", "utf-8", "no"), new XElement("Main", new XElement("Definition", "Definition")));
    doc.Save(myFileName);
    

    XmlDocument ist da ziemlich hässlich, es gibt viele Restriktionen, zb kann man da nicht einfach mit Select komplette listen einmal speichern lassen, und auch beim schreiben muss man die Formatierung mitgeben usw.
    XDocument und dessen XElement ist da um Welten dynamischer.


Anmelden zum Antworten