C# ListView aus XML Laden - Ungültige Daten auf Stammebene

S

Slim.

Gast
Hallo,

ich habe folgendes Problem.

Ich speichere die ListView wie folgt...:

Code:
 XmlTextWriter writer = new XmlTextWriter(Application.StartupPath + "\\Database.xml", null);

            foreach (ListViewItem items in this.lstView.Items)
            {
                writer.WriteStartElement("Datas");
                writer.WriteStartElement("Entries");

                writer.WriteElementString("Name", items.SubItems[0].Text.ToString());
                writer.WriteElementString("Mobile", items.SubItems[1].Text.ToString());
                writer.WriteElementString("Private", items.SubItems[2].Text.ToString());
                writer.WriteElementString("Work", items.SubItems[3].Text.ToString());
                writer.WriteElementString("Email", items.SubItems[4].Text.ToString());

                writer.WriteEndElement();

            }

            writer.Flush();
            writer.Close();
            System.GC.Collect();


...und lade sie wie folgt:

Code:
XmlDocument load = new XmlDocument();
            load.LoadXml(Application.StartupPath + "\\Database.xml");

            XmlNodeList list = load.SelectNodes("/Datas/Entries");


            foreach (XmlNode xn in list)
            {
                string name = xn["Name"].InnerText;
                string mobile = xn["Mobile"].InnerText;
                string privat = xn["Private"].InnerText;
                string work = xn["Work"].InnerText;
                string email = xn["Email"].InnerText;


               ListViewItem item = new ListViewItem(name);

               item.SubItems.Add(mobile);
               item.SubItems.Add(privat);
               item.SubItems.Add(work);
               item.SubItems.Add(email);

               this.lstView.Items.Add(item);


Beim Laden der XML in die ListView erscheint folgender Fehler in VisualStudio:

Ungültige Daten auf Stammebene. Zeile 1, Position 1

und dann markiert VisualStudio folgende Zeile:

Code:
load.LoadXml(Application.StartupPath + "\\Database.xml");


Könnt ihr mir dazu was sagen?

Danke,
Gruß

Chris
 
hmm.... zeig doch mal, wie das XML-File aussieht.

Wenn du ein XSD-Schema für das XML-File hast, kannst du die XML-Datei gegen das Schema validieren?
ich befürchte irgendwie, dass das XML-File nicht ganz korrekt ist.
Oder liegts an vordefinierten Datentypen?

... kurzes brainstorming, vielleicht ist ja was dabei..
 
Zuletzt bearbeitet:
Code:
- <Datas>
- <Entries>
  <Name>Name</Name> 
  <Mobile>Handy</Mobile> 
  <Private>Privat</Private> 
  <Work>Arbeit</Work> 
  <Email>E-Mail</Email> 
  </Entries>
- <Datas>
- <Entries>
  <Name>Name</Name> 
  <Mobile>Handy</Mobile> 
  <Private>Privat</Private> 
  <Work>Arbeit</Work> 
  <Email>E-Mail</Email> 
  </Entries>
  </Datas>
  </Datas>
Ergänzung ()

Ich hab keinen Schimmer, hab auch schon gegoogled...

Bin grad paar Sachen am testen, aber es funzt nicht =/
 
hmm... ich glaube, die Struktur passt einfach nicht.
So wäre es doch eigentlich logisch, hierarchisch:

Code:
- <Datas>
[INDENT]- <Entries>
  [...]
  </Entries>
- <Entries>
  [...]
  </Entries>
- <Entries>
  [...]
  </Entries>[/INDENT]
  </Datas>

Ein (!) Rootknoten (Daten) hat beliebig viele Unterknoten (Entries).
 
Zuletzt bearbeitet:
Hm, dann muss ich ja den Code zum Speichern abändern...

Aber wie :D Ich hab nich soviel Plan davon...
 
Richtig! Aber das sind die Herausforderungen eines Software-Entwicklers! ;-)
Probier's doch erstmal, födert das Verständnis und das nächste mal fällts dir leichter.
Schau einfach durch, welche Methoden dein "writer"-Objekt bietet, bezüglich eines Rootknotens, Unterknoten, etc. . Vielleicht ist eine weitere Schleife von Nöten?
Kann's aus dem Stegreif auch nicht genau sagen, müsste es erst ausprobieren.
Bin aus der Java-Ecke :)
 
Ich würde lieber mit dem XmlSerializer arbeiten...

z.B. lässt sich diese Klasse sehr leicht in XML speichern und lesen:
Code:
    public class Student
    {
        public string Name;
        public string Studiengang;
        public string Password;

        public List<StudentNote>Noten = new List<StudentNote>();

        [System.Xml.Serialization.XmlIgnoreAttribute]
        public StudentNote this[string index] {
            get {
                for (int i = 0; i < Noten.Count; i++) if (Noten[i].LV == index) return Noten[i];

                return null;
            }
        }
        
    }

// Lese-Code
        private Student ReadStudent(string filename)
        {
            Student s = null;
            TextReader reader = null;
            try
            {
                XmlSerializer xml = new XmlSerializer(typeof(Student));
                reader = new StreamReader(filename);
                s = (Student)xml.Deserialize(reader);
            }
            finally
            {
                if (reader != null) reader.Close();
            }            return s;
        }


// Schreib-Code
        private void WriteStudent(Student s, Filename n)
        {
            try
            {
                XmlSerializer xml = new XmlSerializer(typeof(Student));
                TextWriter writer = new StreamWriter(n);
                
                xml.Serialize(writer, s);
                writer.Close();
            }
            catch (Exception)
            {
            }

        }

Kann man natürlich noch verschönern, is stark reduziert...

Ich würde mich mal im XmlSerializer einlesen, das is schon sehr komfortabel.
 
Nur so am Rande: Das Wort data hat keine Mehrzahl. Die XML-Struktur die du gepostet hat ist nicht valide bzw sogar nicht wohlgeformt weil du kein einzelnes root-Element hast. Entweder data beinhält alle entries, oder du brauchst noch ein Element über alle data-Elemente
 

Ähnliche Themen

S
Antworten
4
Aufrufe
4.655
Zurück
Oben