6

読み込んでオブジェクトのセットに変換する必要がある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>

オブジェクト?

4

2 に答える 2

15

示した例ではタグが閉じられていないため、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
}
于 2013-02-16T17:04:29.560 に答える
7

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 );
}
于 2013-02-16T16:34:23.077 に答える