[C#] XML durchlaufen - Personen auslesen


FroxX

Grünschnabel
Hiho,

ich habe diese XML-Datei:
Code:
<contacts>
<contact>
 <person>
  <lastname>Wurst</lastname> 
  <firstname>Hans</firstname> 
  <email>hans@wurst.de</email> 
  <phone>023444-3434344</phone> 
  <country>Deutschland</country> 
  </person>
  <person>
  <lastname>Zarasu</lastname> 
  <firstname>Zergey</firstname> 
  <email>z.zra@su.de</email> 
  <phone>566-565656-565</phone> 
  <country>Brochstejk</country> 
  </person>
  </contact>
  </contacts>
Diese Daten, also jede Person will ich jetzt auslesen, um sie in einer ListView anzuzeigen.

Bisher habe ich folgenden Code, der aber logischerweise nur die erste Person ausliest.

Code:
XmlDocument doc = new XmlDocument();
                doc.Load(@"Contacts.xml");

                XmlNode lastname = doc.SelectSingleNode("/contacts/contact/person/lastname");
                ListViewItem item = new ListViewItem(lastname.InnerText);
                XmlNode firstname = doc.SelectSingleNode("/contacts/contact/person/firstname");
                item.SubItems.Add(firstname.InnerText);
                XmlNode email = doc.SelectSingleNode("/contacts/contact/person/email");
                item.SubItems.Add(email.InnerText);
                XmlNode phone = doc.SelectSingleNode("/contacts/contact/person/phone");
                item.SubItems.Add(phone.InnerText);
                XmlNode country = doc.SelectSingleNode("/contacts/contact/person/country");
                item.SubItems.Add(country.InnerText);

                listViewContacts.Items.Add(item);
                listViewContacts.Refresh();
Wie kann ich hier eine Schleife implementieren, die das für mich korrekt erledigt.

Bin für jede Hilfe dankbar.

Gruß,
FroxX
 

engelmarkus

Erfahrenes Mitglied
Das hier solltest du relativ leicht anpassen können:

C#:
XmlDocument xdoc = new XmlDocument();
xdoc.Load("Daten.xml");

foreach (XmlNode person in xdoc.SelectNodes("/contacts/contact/*")) {
    Console.WriteLine( person["firstname"].InnerText );
}
 

FroxX

Grünschnabel
Danke dir, das ging ja echt schnell.

Der Vollständigkeit halber poste ich hier mal meinen angepassten Code.

Code:
XmlDocument doc = new XmlDocument();
doc.Load(@"Contacts.xml");
                
foreach (XmlNode person in doc.SelectNodes("/contacts/contact/*"))
    {                    
        ListViewItem item = new ListViewItem(person["lastname"].InnerText);
        item.SubItems.Add(person["firstname"].InnerText);
        item.SubItems.Add(person["email"].InnerText);
        item.SubItems.Add(person["phone"].InnerText);
        item.SubItems.Add(person["country"].InnerText);
        listViewContacts.Items.Add(item);
    }
Gruß,
FroxX

PS: Wie kann man denn hier CSHARP-CODE machen?
 

engelmarkus

Erfahrenes Mitglied
Alternativ kannst du das ganze noch weiter abkürzen:

C#:
XmlDocument xdoc = new XmlDocument();
xdoc.Load("Daten.xml");

foreach (XmlNode person in xdoc.SelectNodes("/contacts/contact/*")) {
   ListViewItem lvi = new ListViewItem(person.ChildNodes.Cast<XmlNode>().Select(x => x.InnerText).ToArray());

   listView1.Items.Add(lvi);
   listView1.Refresh();
}
Hierbei musst du nur vorsichtig sein, die Reihenfolge der Knoten in der XML-Datei spielt dabei eine Rolle! :)
Man erstellt eine CS-Codebox so: [ csharp]
 
Zuletzt bearbeitet:

engelmarkus

Erfahrenes Mitglied
Da könnte ich jetzt genauso gut sagen, dass die gewünschte Framework-Version nie genannt wurde ;) .
Außerdem hab ich doch einen anderen Lösungs-Weg dargestellt.
 

Nico Graichen

aka gemballa
Das war weder Beschwerde noch Rüge oder was auch immer sondern ledlich ein Hinweis für den, der es ausprobieren will
 

chrisonline1205

Grünschnabel
Danke dir, das ging ja echt schnell.

Der Vollständigkeit halber poste ich hier mal meinen angepassten Code.

Code:
XmlDocument doc = new XmlDocument();
doc.Load(@"Contacts.xml");
                
foreach (XmlNode person in doc.SelectNodes("/contacts/contact/*"))
    {                    
        ListViewItem item = new ListViewItem(person["lastname"].InnerText);
        item.SubItems.Add(person["firstname"].InnerText);
        item.SubItems.Add(person["email"].InnerText);
        item.SubItems.Add(person["phone"].InnerText);
        item.SubItems.Add(person["country"].InnerText);
        listViewContacts.Items.Add(item);
    }
Gruß,
FroxX

PS: Wie kann man denn hier CSHARP-CODE machen?
Muss dieses alte Thema nochmal eröffen :)
Bin soeben dabei auch ein XML Document einzulesen. Soweit klappt alles mit dem oben beschriebene Beispiel ABER

in meinem XML Document gibt es unter "nodes".

Code:
           XmlDocument xdoc = new XmlDocument();
            xdoc.Load("c:\\temp\\test.xml");

            foreach (XmlNode movie in xdoc.SelectNodes("/playnetworks/movies/*")) {
                string test = movie["original_title"].InnerText;
                string test3 = movie["regions"]["region"]["pictures"]["picture"]["url"].InnerText;
das ["regions"]["region"]["pictures"]["picture"] mit dem "url" kommt jetzt mehrmals pro movie vor.

Wie lese ich das aus? Beim ncähsten durchlauf ist der zeiger bereits beim nächsten movie...

Bitte um Hilfe!

Danke!