[C#] XML durchlaufen - Personen auslesen


FroxX

Grünschnabel
#1
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
#2
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
#3
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
#4
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
#6
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.
 
#8
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!