Problem mit XML Reader


Sposh

Grünschnabel
Hallo zusammen,

ich habe folgendes Problem:
Ich möchte eine XML Datei einlesen, diese bearbeiten und anschließend wieder als XML Datei abspeichern.

Im ersten Schritt geht es um das Einlesen der XML Datei

hierzu habe ich folgenden Code:

Code:
private void button1_Click(object sender, EventArgs e)
        {
            XmlReader reader;
            reader = XmlReader.Create(@"Personen.xml");
            List<Person> liste = new List<Person>();
            Person person = null;
            Adresse adresse = null;
            while (reader.Read())
            {
                // prüfen, ob es sich aktuell um ein Element handelt
                if (reader.NodeType == XmlNodeType.Element)
                {
                    // alle relevanten Elemente untersuchen
                    switch (reader.Name)
                    {
                        case "Person":
                            // neue Person erzeugen und in Liste eintragen
                            person = new Person();
                            liste.Add(person);
                            break;
                        case "Vorname":
                            person.Vorname = reader.ReadString();
                            break;
                        case "Zuname":
                            person.Zuname = reader.ReadString();
                            break;
                        case "Alter":
                            person.Alter = reader.ReadElementContentAsInt();
                            break;
                        case "Adresse":
                            // neue Adresse erzeugen und der Person zuordnen
                            adresse = new Adresse();
                            person.Adresse = adresse;
                            if (reader.HasAttributes)
                            {
                                // Attributsliste durchlaufen
                                while (reader.MoveToNextAttribute())
                                {
                                    if (reader.Name == "Ort")
                                        adresse.Ort = reader.Value;
                                    else if (reader.Name == "Strasse")
                                        adresse.Strasse = reader.Value;
                                }
                            }
                            break;
                    }
                }
            }
            // Liste an der Konsole ausgeben
            GetList(liste);
            reader.Close();
            Console.ReadLine();
         }
         // Ausgabe der Listeneinträge
         static void GetList(List<Person> liste) {
             foreach (Person temp in liste)
             {
                 Console.WriteLine("Vorname: {0}\nZuname: {1}\nAlter: {2}",
                     temp.Vorname, temp.Zuname, temp.Alter);
                 Console.WriteLine("Ort: {0}\nStrasse: {1}\n",
                     temp.Adresse.Ort, temp.Adresse.Strasse);
             }
         }
        }
    }

Allerdings bekomme ich den Fehler angezeigt:

"Fehler 1 Der Typ- oder Namespacename 'Person' konnte nicht gefunden werden. (Fehlt eine Using-Direktive oder ein Assemblyverweis?) x:\eigene dateien\visual studio 2012\Projects\WindowsFormsApplication4\WindowsFormsApplication4\Form1.cs 77 35 WindowsFormsApplication4"

Ich stehe hier irgendwie auf dem Schlauch:( Hat mir jemand ein Lösungsvorschlag?
Habe schon im Internet geschaut welcher using Eintrag das sein könnte.

Vielen Dank!
Tobi
 
Zuletzt bearbeitet:

Turri

Erfahrenes Mitglied
Hallo,

du legst eine leere Liste vom Typ "Person" an.
Hast du denn eine Klasse Person die dort auch bekannt ist?

Ich vermute in der Zeile kracht es.
 

DrMueller

Erfahrenes Mitglied
Sollte eigentlich der Compiler schon merken, wenn Person nicht erkannt wird.
Kannst du denn normal eine Person anlegen? Wenn ja, überschneiden sich evtl. zwei Usings resp. die Verweise müssten geprüft werden.
 

Tikonteroga

Erfahrenes Mitglied
Hallo,

wenn du die XML-Datei lesen, bearbeiten und dann wieder schreiben möchtest, wäre es dann nicht besser wenn du die Klasse XmlDocument verwendest? Du kannst dann jeden Knoten direkt mit XPath sequenziell adressieren und musst nicht dieses switch-case-Konstrukt in der Schleife verwenden. Das passt hier irgendwie nicht zum Kontext und ist auf ineffzient, da jeder case nur einmal auftritt aber trotzdem immer ein Vergleich stattfindet.

Gruß

Tikonteroga
 

Forum-Statistiken

Themen
272.363
Beiträge
1.558.646
Mitglieder
187.837
Neuestes Mitglied
Kalle P