2013-02-16 8 views
6

私は読み込んで一組のオブジェクトに変換する必要があるXMLDocumentを持っています。私は、次のオブジェクトこのXMLドキュメントを自分のオブジェクトに変換する最も簡単な方法は何ですか?

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

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

を持っていると私は、次のXMLファイルを持っている:

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

これを行うための最善の方法は何ですか? xmldocumentをオブジェクトに自動的にシリアル化するか、各要素を解析してオブジェクトに手動で変換する必要がありますか?特に、コレクション(場所、建物など)の変換方法を理解しようとしています。

基本的に

List<Location> 

オブジェクトに、このXMLファイルを変換するための最良の提案は何ですか?

答えて

11

あなたはXMLを固定することにより開始することができます。このLocationクラスに建物以外のプロパティを追加できるように、<Building>タグを<Buildings>コレクションにラップすることもできます。

<?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を修正したら、モデルを適応させることができます。私の代わりにあなたのクラス内のフィールドのプロパティを使用して、あなたをお勧めします:

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

、今残っているすべては、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

ただ、例えばXMLシリアル化の属性 - を使用します。

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

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

ただ覚えている - すべては、デフォルトでXML要素としてシリアル化されます - samesでオブジェクトの名前と同じ:)

負荷にこれを実行します。例では、あなたが閉じていないタグを持って示されているので、

using(var stream = File.OpenRead("somefile.xml")) 
{ 
    var serializer = new XmlSerializer(typeof(List<Location>)); 
    var locations = (List<Location>)serializer.Deserialize(stream); 
} 
関連する問題