Verschachteltes XML einlesen
In dem heutigen Beitrag möchte ich euch zeigen, wie ihr mit wenig Aufwand verschachtelte XML-Dokument einlesen und anschließend verarbeiten könnt. Dies ist zum Beispiel dann recht spannend, wenn es mehrere Einträge mit dem gleichen Tag-Namen gibt und alle Einträge entsprechend verarbeitet werden sollen.
Zunächst legen wir uns eine Klasse Person an, welche über die folgenden Eigenschaften verfügt:
1 2 3 4 5 6 |
public class Person { public string FirstName { get; set; } public string LastName { get; set; } public List<Phone> PhoneNumbers { get; set; } } |
Anschließend definieren wir die Klasse Phone, welche über die folgenden Eigenschaften verfügt:
1 2 3 4 5 |
public class Phone { public string AreaCode{ get; set; } public string Number{ get; set; } } |
Wie man sehen kann, möchte ich das Szenario abbilden, dass eine Person zunächst nur über einen Vor- und einen Nachnamen verfügt, aber mehrere Telefonnummern haben kann.
Nun benötigen wir noch eine kleine XML-Datei, welche den folgenden Inhalt für unser Beispiel haben sollte:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
<?xml version="1.0" encoding="utf-8"?> <persons> <person> <firstname>Sebastian</firstname> <lastname>Jensen</lastname> <phone> <areacode>555</areacode> <number>12345678</number> </phone> <phone> <areacode>555</areacode> <number>87654321</number> </phone> </person> <person> <firstname>Thomas</firstname> <lastname>Jensen</lastname> <phone> <areacode>555</areacode> <number>23456789</number> </phone> <phone> <areacode>555</areacode> <number>98765432</number> </phone> </person> </persons> |
Wir wollen nun die Methode schreiben, welche die Daten aus dem XML-File mycontacts.xml ausliest und entsprechend speichert.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
public List<Person> Persons { get; set; } private void LoadPersons() { var xdoc = System.Xml.Linq.XDocument.Load("Data/mycontacts.xml"); var res = from item in xdoc.Descendants("person") select new Person { FirstName = item.Element("firstname").Value, LastName = item.Element("lastname").Value, PhoneNumbers = item.Elements("phone").Select( x => new Phone { AreaCode = x.Element("areacode").Value, Number = x.Element("number").Value }).ToList() }; Persons = res.toList(); } |
Anschließend ist in der Liste Persons nun eine Liste von Personen gespeichert, welche aus dem XML-File geladen wurden.