Autor |
Beitrag |
TheSoul
      
Beiträge: 73
Erhaltene Danke: 2
Win 95, Win 98, WIN 2000, Win XP, Win Vista, Win 7
Visual C#
|
Verfasst: Di 02.02.10 10:25
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?
_________________ Fluchen ist die einzige Sprache, die alle Programmierer wirklich beherrschen.
Ich würd so gern die Welt verändern, aber Gott gibt mir den Quellcode nicht
|
|
jaenicke
      
Beiträge: 19326
Erhaltene Danke: 1749
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Di 02.02.10 10:27
Wie sieht dein Quelltext denn aus, der für die XML-Datei zuständig ist?
|
|
TheSoul 
      
Beiträge: 73
Erhaltene Danke: 2
Win 95, Win 98, WIN 2000, Win XP, Win Vista, Win 7
Visual C#
|
Verfasst: 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.
_________________ Fluchen ist die einzige Sprache, die alle Programmierer wirklich beherrschen.
Ich würd so gern die Welt verändern, aber Gott gibt mir den Quellcode nicht
|
|
TheSoul 
      
Beiträge: 73
Erhaltene Danke: 2
Win 95, Win 98, WIN 2000, Win XP, Win Vista, Win 7
Visual C#
|
Verfasst: Di 02.02.10 17:53
hat sich erledigt
_________________ Fluchen ist die einzige Sprache, die alle Programmierer wirklich beherrschen.
Ich würd so gern die Welt verändern, aber Gott gibt mir den Quellcode nicht
|
|
JüTho
      
Beiträge: 2021
Erhaltene Danke: 6
Win XP Prof
C# 2.0 (#D für NET 2.0, dazu Firebird); früher Delphi 5 und Delphi 2005 Pro
|
Verfasst: 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
      
Beiträge: 1012
Erhaltene Danke: 24
Windows XP
C#, Visual Studio
|
Verfasst: 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 
      
Beiträge: 73
Erhaltene Danke: 2
Win 95, Win 98, WIN 2000, Win XP, Win Vista, Win 7
Visual C#
|
Verfasst: Mi 03.02.10 09:52
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.
_________________ Fluchen ist die einzige Sprache, die alle Programmierer wirklich beherrschen.
Ich würd so gern die Welt verändern, aber Gott gibt mir den Quellcode nicht
|
|
danielf
      
Beiträge: 1012
Erhaltene Danke: 24
Windows XP
C#, Visual Studio
|
Verfasst: 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
|
|
|