Entwickler-Ecke
IO, XML und Registry - Beim Laden XML lesen und komplett übernehmen
TheSoul - Di 02.02.10 10:25
Titel: Beim Laden XML lesen und komplett übernehmen
Hallo Zusammen,
Ich habe etwas programmiert, dass wenn ich am Programm etwas eingabe, speichert es alle Eingaben in eine xml datei. Wenn ich jedoch das Programm schliesse und erneut öffne, überschreibt es die Daten die ich schon eingefügt habe.
Ich möchte jetzt beim Laden des Programms das XML einlesen, so dass der bestehende bearbeitet werden kann.Wie kann ich das machen?
Könnt ihr mir da weiterhelfen?
jaenicke - Di 02.02.10 10:27
Wie sieht dein Quelltext denn aus, der für die XML-Datei zuständig ist?
TheSoul - Di 02.02.10 10:39
Bestehender Code zum lesen:
C#-Quelltext
1: 2: 3: 4: 5: 6:
| private void btnReadXML_Click(object sender, EventArgs e) { string filePath = (@"C:\xml\konfig.xml"); System.IO.StreamReader sr = new StreamReader(filePath); string xmlContent = sr.ReadToEnd(); sr.Close(); |
Zum Speichern:
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26:
| public void SaveXML() { XmlDocument doc = new XmlDocument(); XmlNode konfigurationXML; konfigurationXML = doc.CreateElement("Konfiguration");
XmlNode programmkonfigurationXML = doc.CreateElement("Programmkonfiguration"); konfigurationXML.AppendChild(programmkonfigurationXML);
XmlNode reportkonfigurationXML = doc.CreateElement("Reportkonfiguration"); konfigurationXML.AppendChild(reportkonfigurationXML);
XmlNode programmkonfigurationKonfigurationspfad = doc.CreateElement("Konfigurationspfad"); programmkonfigurationKonfigurationspfad.InnerText = programmkonfiguration.Konfigurationspfad; programmkonfigurationXML.AppendChild(programmkonfigurationKonfigurationspfad);
XmlNode programmkonfigurationZeit = doc.CreateElement("Zeit"); programmkonfigurationZeit.InnerText = Convert.ToString(programmkonfiguration.Zeit); programmkonfigurationXML.AppendChild(programmkonfigurationZeit); |
Nun fehlt noch die Methode zum Laden der XML Datei. Ich denke ich muss die Variabel xmlcontent füllen.
C#-Quelltext
1: 2: 3: 4:
| public void LoadXML(string xmlcontent) { } |
Wahrscheinlich muss es etwa das umgekehrte von der Methode SaveXML sein. ich habe die Methode doc.Loadxml entdeckt, aber das hat mir auch nicht weitergeholfen.
TheSoul - Di 02.02.10 17:53
hat sich erledigt
JüTho - Di 02.02.10 18:49
TheSoul hat folgendes geschrieben : |
hat sich erledigt |
Und wie? Für spätere Leser mit dem gleichen oder einem ähnlichen Problem wäre es sehr angenehm, hier eine Lösung zu finden. Jürgen
danielf - Di 02.02.10 21:38
Ich finde es sehr umständlich wenn du für die Settings selber eine Xml generierst, bzw. speichern und laden tust.
Du kannst auch einfach eine Settings-Klasse machen und diese Serialisieren (XmlSerializer).
Oder gleich Apps.config?
Gruß Daniel
TheSoul - Mi 03.02.10 09:52
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47:
| public void LoadXML(string fileName) { XmlDocument doc = new XmlDocument(); doc.LoadXml(ReadXML(fileName));
XmlElement root = doc.DocumentElement; XmlNodeList nodes = root.SelectNodes("/Konfiguration/Programmkonfiguration");
foreach (XmlNode node in nodes[0].ChildNodes) { switch (node.Name) { case "Konfigurationspfad": programmkonfiguration.Konfigurationspfad = node.InnerText; break; case "Zeit": programmkonfiguration.Zeit = TimeSpan.Parse(node.InnerText); break; case "Hotkey": { foreach (XmlNode hotkeys in node.ChildNodes) { Hotkey hotkey = new Hotkey((System.Windows.Forms.Keys)Enum.Parse(typeof(System.Windows.Forms.Keys), hotkeys["Taste"].InnerText), hotkeys["Name"].InnerText); programmkonfiguration.AddHotkey(hotkey); } } break; } }
nodes = root.SelectNodes("/Konfiguration/Reportkonfiguration");
foreach (XmlNode node in nodes[0].ChildNodes) { switch (node.Name) { case "Name": { Reportkonfiguration report = new Reportkonfiguration(); report.Aktiv = Convert.ToBoolean(node["AktivInaktiv"].InnerText); report.Seitenwechsel = Convert.ToInt32(node["Seitenwechsel"].InnerText); report.Url = node["URL"].InnerText; report.Name = node.Attributes["ID"].Value; reportkonfigurationen.Add(report); } break; } } |
Hier noch die Lösung.
@danielf
Da es ein Auftrag ist, kann ich die Vorgaben nicht ändern.
danielf - Mi 03.02.10 12:13
Okay,.. dann musst du da wohl durch ;)
Dennoch würde ich dein Code ein bisschen umgestalten. Du hast ja für die verschiedenen Einstellungskategorien verschiedene Objekte angelegt. Reportkonfiguration und programmkonfiguration? Dementsprechend würde ich die Funktionalitäten zum Serialisieren in diese Klassen packen. Sprich es würde dann so aussehen:
C#-Quelltext
1: 2: 3: 4: 5: 6: 7:
| public Config LoadConfig(string fileName) { XmlDocument doc = new XmlDocument(); doc.LoadXml(fileName);
return Config.FromXmlNode(doc.selectSingleNode("/Konfiguration")); } |
Die Config könnte dann so aussehn:
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10:
| ... public ProgramKonfiguration Program { get; set; } public ReportKonfiguration Report{ get; set; }
public static LoadFromXml(XmlElement element) { this.Program = Programmkonfiguration.FromXmlNode(doc.SelectSingleNode("/Konfiguration/Programmkonfiguration");
this.Report = Programmkonfiguration.FromXmlNode(doc.SelectSingleNode("/Konfiguration/Reportkonfiguration"); } |
Gruß Daniel
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!