Autor Beitrag
TheSoul
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 73
Erhaltene Danke: 2

Win 95, Win 98, WIN 2000, Win XP, Win Vista, Win 7
Visual C#
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19326
Erhaltene Danke: 1749

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Di 02.02.10 10:27 
Wie sieht dein Quelltext denn aus, der für die XML-Datei zuständig ist?
TheSoul Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 73
Erhaltene Danke: 2

Win 95, Win 98, WIN 2000, Win XP, Win Vista, Win 7
Visual C#
BeitragVerfasst: Di 02.02.10 10:39 
Bestehender Code zum lesen:

ausblenden 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:
ausblenden 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.

ausblenden 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 73
Erhaltene Danke: 2

Win 95, Win 98, WIN 2000, Win XP, Win Vista, Win 7
Visual C#
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
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
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 1012
Erhaltene Danke: 24

Windows XP
C#, Visual Studio
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 73
Erhaltene Danke: 2

Win 95, Win 98, WIN 2000, Win XP, Win Vista, Win 7
Visual C#
BeitragVerfasst: Mi 03.02.10 09:52 
ausblenden volle Höhe 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.

_________________
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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 1012
Erhaltene Danke: 24

Windows XP
C#, Visual Studio
BeitragVerfasst: 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:

ausblenden 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:

ausblenden 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