【问题标题】:What is the easiest way to convert this XML document to my object?将此 XML 文档转换为我的对象的最简单方法是什么?
【发布时间】:2013-02-01 11:27:51
【问题描述】:

我有一个 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>

对象?

【问题讨论】:

    标签: c# xml converter xmldocument


    【解决方案1】:

    您可以从修复 XML 开始,因为在示例中您已经展示了未闭合的标签。您还可以将 &lt;Building&gt; 标记包装到 &lt;Buildings&gt; 集合中,以便能够在此 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
    }
    

    【讨论】:

      【解决方案2】:

      只需使用 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 );
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-10-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-10-08
        • 2014-05-09
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多