2013-02-16 7 views
6

Ich habe ein XMLDocument, das ich einlesen und in eine Menge von Objekten konvertieren muss. Ich habe die folgenden ObjekteWas ist der einfachste Weg, um dieses XML-Dokument in mein Objekt zu konvertieren?

public class Location 
{ 
     public string Name; 
     public List<Building> Buildings; 
} 

public class Building 
{ 
    public string Name; 
    public List<Room> Rooms; 
} 

und ich habe die folgende XML-Datei:

<?xml version="1.0" encoding="utf-8" ?> 
<info> 
<locations> 
    <location name="New York"> 
    <Building name="Building1"> 
    <Rooms> 
     <Room name="Room1"> 
     <Capacity>18</Capacity> 
     </Room> 
     <Room name="Room2"> 
     <Capacity>6</Capacity> 
     </Room> 
    </Rooms> 
    </Building> 

    <Building name="Building2"> 
    <Rooms> 
     <Room name="RoomA"> 
     <Capacity>18</Capacity> 
     </Room> 
    </Rooms> 
    </Building> 
</location> 
<location name ="London"> 
    <Building name="Building45"> 
    <Rooms> 
     <Room name="Room5"> 
     <Capacity>6</Capacity> 
     </Room> 
    </Building> 
</location> 
</locations> 
</info> 

Was ist der beste Weg, dies zu tun? Sollte ich das xmldocument automatisch zum Objekt serialisieren oder muss ich jedes Element auslesen und manuell in mein Objekt konvertieren? Insbesondere versuche ich herauszufinden, wie man die Sammlungen (Orte, Gebäude usw.) umwandelt.

Was ist der beste Vorschlag diese XML-Datei in im Grunde ein

List<Location> 

Objekte zu konvertieren?

Antwort

11

Sie da durch die Festsetzung Ihre XML beginnen könnte in dem Beispiel haben Sie Sie nicht geschlossene Tags gezeigt haben. Sie können die Tags <Building> auch in eine <Buildings>-Auflistung einschließen, um andere Eigenschaften in dieser Standortklasse als Gebäude verwenden zu können.

<?xml version="1.0" encoding="utf-8" ?> 
<info> 
    <locations> 
    <location name="New York"> 
     <Buildings> 
     <Building name="Building1"> 
      <Rooms> 
      <Room name="Room1"> 
       <Capacity>18</Capacity> 
      </Room> 
      <Room name="Room2"> 
       <Capacity>6</Capacity> 
      </Room> 
      </Rooms> 
     </Building> 

     <Building name="Building2"> 
      <Rooms> 
      <Room name="RoomA"> 
       <Capacity>18</Capacity> 
      </Room> 
      </Rooms> 
     </Building> 
     </Buildings> 
    </location> 
    <location name="London"> 
     <Buildings> 
     <Building name="Building45"> 
      <Rooms> 
      <Room name="Room5"> 
       <Capacity>6</Capacity> 
      </Room> 
      </Rooms> 
     </Building> 
     </Buildings> 
    </location> 
    </locations> 
</info> 

Sobald Sie Ihren XML-Code korrigiert haben, können Sie Ihre Modelle anpassen. Ich möchte Sie mit Eigenschaften anstelle von Feldern in Ihren Klassen empfehlen:

public class Location 
{ 
    [XmlAttribute("name")] 
    public string Name { get; set; } 

    public List<Building> Buildings { get; set; } 
} 

public class Building 
{ 
    [XmlAttribute("name")] 
    public string Name { get; set; } 
    public List<Room> Rooms { get; set; } 
} 

public class Room 
{ 
    [XmlAttribute("name")] 
    public string Name { get; set; } 
    public int Capacity { get; set; } 
} 

[XmlRoot("info")] 
public class Info 
{ 
    [XmlArray("locations")] 
    [XmlArrayItem("location")] 
    public List<Location> Locations { get; set; } 
} 

und jetzt alle, die die XML deserialisieren übrig geblieben ist:

var serializer = new XmlSerializer(typeof(Info)); 
using (var reader = XmlReader.Create("locations.xml")) 
{ 
    Info info = (Info)serializer.Deserialize(reader); 
    List<Location> locations = info.Locations; 
    // do whatever you wanted to do with those locations 
} 
6

Verwenden Sie einfach den XML-Serialisierung Attributen- zum Beispiel:

public class Location 
{ 
     [XmlAttribute("name"); 
     public string Name; 
     public List<Building> Buildings; 
} 

public class Building 
{ 
    [XmlAttribute("name"); 
    public string Name; 
    public List<Room> Rooms; 
} 

Denken Sie daran - alles wird als XML-Elemente standardmäßig serialisiert werden - mit der sames der gleichen wie die Namen der Objekte :)

tun Sie dies zu laden:

using(var stream = File.OpenRead("somefile.xml")) 
{ 
    var serializer = new XmlSerializer(typeof(List<Location>)); 
    var locations = (List<Location>)serializer.Deserialize(stream); 
} 
Verwandte Themen