C# ListView Daten aus XML laden - speichern klappt

S

Slim.

Gast
Tag zusammen,

ich verzweifle bald... ich will auf diese Methode, wie ihr im Code seht das XML Dokument speichern, was auch klappt... ich komme mit dem reinladen in die ListView nicht klar...

Im Anhang hänge ich euch mal die XML wie die aufgebaut ist + den Code den ich bis jetzt zum Speichern / Laden geschrieben habe.

Warscheinlich ist es simpel aber ich finde nix... =/
Könnt ihr mir dabei helfen? Wäre echt super!

Danke schonmal
Chris

C# Code

Code:
private void ms_savepath_Click(object sender, EventArgs e)
        {

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

            writer.Formatting = Formatting.Indented;

            foreach (ListViewItem items in this.lsview.Items)
            {

            writer.WriteComment("This is the database of the Likeys - Key Management application");

            writer.WriteStartElement("Entrie");
            writer.WriteStartElement("Keys");


            writer.WriteElementString("Typ", items.SubItems[0].Text);
            writer.WriteElementString("Softwarename", items.SubItems[1].Text);
            writer.WriteElementString("Organisation", items.SubItems[2].Text);
            writer.WriteElementString("RegName", items.SubItems[3].Text);
            writer.WriteElementString("AuthKey", items.SubItems[4].Text);
            writer.WriteElementString("Key", items.SubItems[5].Text);
        
            writer.WriteEndElement();

            }

            writer.Close();

            System.GC.Collect();
        }

        private void ms_loadpath_Click(object sender, EventArgs e)
        {
            //XmlTextReader reader = new XmlTextReader(Application.StartupPath + "\\Database.xml");
            XmlDocument doc = new XmlDocument();
            doc.Load(Application.StartupPath + "\\Database.xml");


            XmlNode node1 = doc.SelectNodes("/Entrie/Keys/Typ");
                XmlNode node2 = doc.ChildNodes("/Entrie/Keys/Softwarename");


                ListViewItem lvi = new ListViewItem(node1.InnerText);
                lvi.SubItems.Add(node2.InnerText);

                this.lsview.Items.Add(lvi);

                // Analog für die anderen
                //XmlNode node2 = doc.SelectSingleNode("/Settings/FileTyp");
                //textBox2.Text = node2.InnerText;
                //XmlNode node3 = doc.SelectSingleNode("/Settings/FileName");
                //textBox3.Text = node3.InnerText;


        }


XML Code

Code:
- <!-- This is the database of the Likeys - Key Management application
  --> 
- <Entrie>
- <Keys>
  <Typ>Game</Typ> 
  <Softwarename>Softwarename</Softwarename> 
  <Organisation>Organisation</Organisation> 
  <RegName>Reg.name</RegName> 
  <AuthKey>Auth.key</AuthKey> 
  <Key>Key</Key> 
  </Keys>
- <!-- This is the database of the Likeys - Key Management application
  --> 
- <Entrie>
- <Keys>
  <Typ>Program</Typ> 
  <Softwarename>Softwarename</Softwarename> 
  <Organisation>Organisation</Organisation> 
  <RegName>Reg.name</RegName> 
  <AuthKey>Auth.key</AuthKey> 
  <Key>Key</Key> 
  </Keys>
- <!-- This is the database of the Likeys - Key Management application
  --> 
- <Entrie>
- <Keys>
  <Typ>Other</Typ> 
  <Softwarename>Softwarename</Softwarename> 
  <Organisation>Organisation</Organisation> 
  <RegName>Reg.name</RegName> 
  <AuthKey>Auth.key</AuthKey> 
  <Key>Key</Key> 
  </Keys>
  </Entrie>
  </Entrie>
  </Entrie>
 
Deinem Post nach gehe ich davon aus, dass der Code bei dir kompiliert - das tut er bei mir nicht. Der Compiler schreit, meines Erachtens zu Recht, bei der Zeile mit "SelectNodes" - weil "SelectNodes" (wie auch in der MSDN dokumentiert) eine Liste von Nodes zurückgibt. Das ist ja auch logisch, weil ich schließlich mehr als einen Node mit dem gleichen Namen haben kann (http://msdn.microsoft.com/en-us/library/system.xml.xmlnode.selectnodes.aspx
).
Wenn du weißt, dass nur ein Node semantisch Sinn macht, kannst du ja auch wie im auskommentierten Code "SelectSingleNode" verwenden.

Mit SelectSingleNode kompiliert das Programm, allerdings weint der XML-Parser. Bindestriche zwischen einem schließenden und einem öffnenden Tag sind nicht XML-konform.
Code:
 </Keys>
[COLOR="Red"]- [/COLOR]<!--

(Rot markiert = nicht konform).
Wenn du die rauslöscht funktioniert der Code und in der Listview erscheint "Game" und "Software" (das Subitem kommt natürlich nur wenn man mindestens 2 Colums definiert hat und die richtige "View" ausgewählt ist)

LG
Alexander
 
Wäre es nicht einfacher, wenn du einfach ne Klasse erstellst, so in etwa:
PHP:
public class Entry
        {
            public string Type
            {get;set;}

            public string SoftwareName
            {get;set;}
            
            usw...

        }

Dann erstellst du eine BindingList und bindest sie an das Listview:
PHP:
BindingList<Entry> bList = new BindingList<Entry>();
ListView.DataSource = bList;


So kannst du dann die BindingList ganz einfach per XmlSerializer in ne XML Datei serialisieren und zum laden wieder deserialisieren.
Ist nur ein Vorschlag, aber imo ist es so viel einfacher und übersichtlicher.
 
Noch besser ist es, einfach eine Klasse zu erstellen, die du sehr einfach de-/serialisieren.

Aus deinem XML einfach mit der xsd.exe (VS Command Promt), zuerst ein XSD und daraus das Classfile generieren.

Dann ist das Serialisieren -/deserialisieren sicher schneller ;)
 

Ähnliche Themen

Zurück
Oben