簡體   English   中英

將此XML文檔轉換為我的對象的最簡單方法是什么?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM