2013-02-16 26 views
6

Okumak ve bir nesne kümesine dönüştürmem gereken bir XMLDocument var. Aşağıdaki nesnelerBu XML belgesini nesneme dönüştürmenin en kolay yolu nedir?

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

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

var ve aşağıdaki XML dosyası var:

<?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> 

Bunu yapmanın en iyi yolu nedir? Xmldocument nesnelere otomatik olarak serileştirmeli mi yoksa her bir elemanı ayrıştırmam ve nesneyi el ile dönüştürmem gerekiyor mu? Özellikle, koleksiyonları nasıl dönüştüreceğimi anlamaya çalışıyorum (yerler, binalar, vb.).

temelde

List<Location> 

nesnelerin içine bu XML dosyası dönüştürmek için en iyi öneri nedir?

cevap

11
örnekte size kapanmamış etiketlerine sahip göstermiştir çünkü XML'inizi sabitleme başlayabilirsin

. Binalar dışındaki bu Konum sınıfında başka özelliklere sahip olabilmeniz için <Building> etiketlerini <Buildings> koleksiyonuna da ekleyebilirsiniz.

<?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> 

XML'inizi düzelttikten sonra, modellerinizi uyarlayabilirsiniz. Ben Sınıflarınızdaki alanların yerine özelliklerini kullanarak tavsiye ederim: bıraktı şimdi

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; } 
} 

ve tüm edilir serisini XML:

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

Sadece örneğin XML seri öz nitelikleri kullanın: - her şey varsayılan olarak XML öğelerini olarak tefrika edilecek -

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

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

Şunu unutma nesnelerin isimlerinin :)

aynı aynılar ile yüke bunu yapın

:

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