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...
- XmlWriter FTW
- 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.