.NET XML десериализация - PullRequest
       1

.NET XML десериализация

2 голосов
/ 02 сентября 2011

У меня есть следующий XML-канал. Мне нужно сделать десериализацию для List объектов. Как я могу добиться этого в .NET 4.0 C #?

<body>
  <games>
     <sports>
       <lot_name>Football</lot_name>
       <prizes>
           <!-- For each prize the "division_" tag ends with different number -->
           <divisions_1>
              <divisions>1</divisions>
              <match>5-2</match>
              <pay>$10</pay>
           </divisions_1>
           <divisions_2>
              <divisions>2</divisions>
              <match>3-2</match>
              <pay>$5</pay>
          </divisions_2>
       </prizes>
     </sports>
  </games>
</body>

Ответы [ 3 ]

1 голос
/ 02 сентября 2011

Посмотрите на здесь , хорошее объяснение.

xsd.exe - это удобный маленький инструмент, который поставляется с .NET SDK (Software Development Kit), который может сделать жизньлегко, если вы хотите быстро перейти от ввода XML к строго типизированному объекту .NET.

Если вы начинаете с файла XML:

1) Откройте файл XML в VisualStudio

2) В меню XML нажмите «Создать схему».Это создаст XSD-файл.

Остальные здесь .

0 голосов
/ 02 сентября 2011

Если вы не хотите сгенерировать XSD с N division_x элементами, где x = [1..N], вы должны реализовать IXmlSerializable.Следующий код прекрасно десериализует пример xml:

public class Sports : IXmlSerializable
{
    public string LotName { get; set; }

    public List<dynamic> Prices { get; set; }

    #region IXmlSerializable Members

    public System.Xml.Schema.XmlSchema GetSchema()
    {
        return null;
    }

    public void ReadXml(System.Xml.XmlReader reader)
    {
        Prices = new List<dynamic>();
        reader.Read();
        LotName = reader.ReadElementContentAsString("lot_name", "");
        reader.Read();
        while (reader.Name.StartsWith("divisions_"))
        {
            reader.Read();
            var i = reader.ReadElementContentAsString("divisions", "");
            var m = reader.ReadElementContentAsString("match", "");
            var p = reader.ReadElementContentAsString("pay", "");
            Prices.Add(new { ID = i, Match = m, Pay = p });
            reader.Read();
        }

    }

    public void WriteXml(System.Xml.XmlWriter writer)
    {
        throw new NotImplementedException();
    }

    #endregion
}

public class Games  {
    [XmlElement("sports")]
    public Sports Sports { get; set; }
}


[XmlRoot("body")]
public class Body 
{
    [XmlElement("games")]
    public Games Games { get; set; }

}

Он использует XmlSerialization, потому что я не совсем уверен, как это сделать с Data Contract Serializer (хотя я знаю, что это можно сделать).И вы можете захотеть добавить обработку ошибок в метод ReadXml.

PS.Вы можете сделать это с одним классом, который реализует XmlSerializer и испускает много динамических классов:)

0 голосов
/ 02 сентября 2011

Взгляните на ЭТОЕ учебное пособие о том, как выполнять сериализацию XML, этот пример довольно близок к вашему.

В основном вам нужно создать класс, который представляет каждую сущность в вашем XML (например, Sports) и соответствующие свойства, а затем использовать XmlSerializer для его десериализации.

Более сложным способом, но где вы можете обрабатывать странные теги <division_X>, было бы использовать XmlReader и самостоятельно читать элементы и назначать их соответствующим классы / объекты.

...