[英]What is the easiest way to convert this XML document to my object?
我有一個XMLDocument,我需要讀入並轉換為一組對象。 我有以下物品
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序列化到對象還是我需要解析每個元素並手動轉換為我的對象? 特別是,我試圖弄清楚如何轉換集合(位置,建築物等)。
將此XML文件轉換為基本的最佳建議是什么?
List<Location>
對象?
您可以從修復XML開始,因為在您顯示的示例中,您有未閉合的標記。 您還可以將<Building>
標記包裝到<Buildings>
集合中,以便能夠在此Location類中具有除建築物之外的其他屬性。
<?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
}
只需使用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元素 - 與對象的名稱相同:)
這樣做加載:
using(var stream = File.OpenRead("somefile.xml"))
{
var serializer = new XmlSerializer(typeof(List<Location>));
var locations = (List<Location>)serializer.Deserialize(stream );
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.