2013-02-16 28 views
6

Tôi có một XMLDocument mà tôi cần phải đọc và chuyển đổi thành một tập hợp các đối tượng. Tôi có các đối tượng sau đâyCách dễ nhất để chuyển đổi tài liệu XML này thành đối tượng của tôi là gì?

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

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

và tôi có file XML sau:

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

cách tốt nhất để làm điều này là gì? Tôi có nên tuần tự hóa xmldocument cho đối tượng một cách tự động hay tôi cần phân tích từng phần tử và chuyển đổi thành đối tượng của tôi theo cách thủ công? Đặc biệt, tôi đang cố gắng tìm ra cách để chuyển đổi các bộ sưu tập (địa điểm, tòa nhà, v.v.).

gợi ý tốt nhất để chuyển đổi tập tin XML này vào cơ bản là một

List<Location> 

đối tượng là gì?

Trả lời

11

bạn có thể bắt đầu bằng cách sửa chữa XML của bạn bởi vì trong ví dụ bạn đã chứng tỏ bạn có thẻ không khép kín. Bạn cũng có thể quấn các thẻ <Building> vào bộ sưu tập <Buildings> để có thể có các thuộc tính khác trong lớp Vị trí này ngoài các tòa nhà.

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

Khi bạn đã sửa XML của mình, bạn có thể điều chỉnh mô hình của mình. Tôi muốn giới thiệu bạn sử dụng thuộc tính thay vì các lĩnh vực trong lớp học của bạn:

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

và bây giờ tất cả những gì còn lại là deserialize 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

Chỉ cần sử dụng attributes- serialization XML ví dụ:

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

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

Chỉ cần nhớ - tất cả mọi thứ sẽ được tuần tự như yếu tố XML theo mặc định - với sames giống như tên của các đối tượng :)

làm điều này để tải:

using(var stream = File.OpenRead("somefile.xml")) 
{ 
    var serializer = new XmlSerializer(typeof(List<Location>)); 
    var locations = (List<Location>)serializer.Deserialize(stream); 
} 
Các vấn đề liên quan