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");


            // Save Programkonfiguration first:
            //

            // Node: Programmkonfiguration
            XmlNode programmkonfigurationXML = doc.CreateElement("Programmkonfiguration");
            konfigurationXML.AppendChild(programmkonfigurationXML);

            XmlNode reportkonfigurationXML = doc.CreateElement("Reportkonfiguration");
            konfigurationXML.AppendChild(reportkonfigurationXML);

            // Node: Konfigurationspfad
            XmlNode programmkonfigurationKonfigurationspfad = doc.CreateElement("Konfigurationspfad");
            programmkonfigurationKonfigurationspfad.InnerText = programmkonfiguration.Konfigurationspfad;
            programmkonfigurationXML.AppendChild(programmkonfigurationKonfigurationspfad);

            // Node: Zeit
            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

user profile iconTheSoul hat folgendes geschrieben Zum zitierten Posting springen:
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":
                        {
                            //foreach (XmlNode Name in node.ChildNodes)
                            //{
                                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