Десериализация XML

У меня есть следующий XML-файл.

<a>
  <b>
    <c>val1</c>
    <d>val2</d>
  </b>
  <b>
    <c>val3</c>
    <d>val4</d>
  </b>
<a>

Я хочу десериализовать это в класс, и я хочу получить доступ к ним с объектами созданного класса. Я использую C#. Я могу десериализовать и получить значение в объект класса‘a’( <a> тег). но как получить доступ к значению <b> от этого объекта? Я сделал следующее кодирование:

[Serializable()]
[XmlRoot("a")]
public class a
{
    [XmlArray("a")]
    [XmlArrayItem("b", typeof(b))]
    public b[] bb{ get; set; }
}

[Serializable()]
public class b
{
    [XmlElement("c")]
    public string c{ get; set; }
    [XmlElement("d")]
    public string d{ get; set; }    
}
class Program
{
        static void Main(string[] args)
        {

            a i = null;
            string path = "test.xml";

            XmlSerializer serializer = new XmlSerializer(typeof(a));

            StreamReader reader = new StreamReader(path);
            i = (a)serializer.Deserialize(reader);
            reader.Close();
            //i want to print all b tags here
            Console.Read();
        }
    }
5
задан Nave 14 June 2010 в 08:17
поделиться

3 ответа

Чтобы это работало, вы можете внести следующее изменение

public class a
{
    [XmlElement("b")]
    public b[] bb{ get; set; }
}

Используя атрибут XmlElement в массиве, вы, по сути, сообщаете сериализатору, что элементы массива должны быть сериализованы / десериализованы как прямые дочерние элементы. текущего элемента.

Вот рабочий пример. Я помещаю XML в строку, чтобы сделать пример самодостаточным.

using System;
using System.IO;
using System.Xml.Serialization;

namespace ConsoleApplication1
{
  class Program
  {
    static void Main(string[] args)
    {
      string xml =
        @"<a> 
            <b> 
              <c>val1</c> 
              <d>val2</d> 
            </b> 
            <b> 
              <c>val3</c> 
              <d>val4</d> 
            </b> 
          </a>";

      XmlSerializer xs = new XmlSerializer(typeof(a));
      a i = (a)xs.Deserialize(new StringReader(xml));

      if (i != null && i.bb != null && i.bb.Length > 0)
      {
        Console.WriteLine(i.bb[0].c); 
      }
      else
      {
        Console.WriteLine("Something went wrong!"); 
      }

      Console.ReadKey();
    }
  }


  [XmlRoot("a")]
  public class a
  {    
    [XmlElement("b")]
    public b[] bb { get; set; }
  }

  public class b
  {
    [XmlElement("c")]
    public string c { get; set; }
    [XmlElement("d")]
    public string d { get; set; }
  }  
}
7
ответ дан 14 December 2019 в 04:30
поделиться

Я считаю, что самый простой способ решить проблему - это изменить определение классов a и b на следующее

public class b {
    public string c { get; set; }
    public string d { get; set; }
}

[XmlRoot(Namespace="", ElementName="a")]
public class a : List<b> { }

, затем ваша программа буду работать. При желании вы можете добавить к классу b атрибут [XmlRoot (Namespace = "", ElementName = "b")]

0
ответ дан 14 December 2019 в 04:30
поделиться

Если вы сомневаетесь в создании классов сериализации xml, я считаю, что самый простой способ решить проблему:

  • выгрузить все ваши фиктивные данные в файл XML
  • запустить xsd.exe для создания схемы .xsd файл
  • запустите xsd.exe в вашем файле схемы, чтобы создать файл класса

Я написал краткое руководство по нему в сообщении в блоге некоторое время назад: http://www.diaryofaninja.com/blog/2010/05/07/make-your-xml-stronglytyped-because-you-can-and-its-easy

это занимает меньше минуты и затем вы можете легко настроить вещи оттуда. XSD.exe - ваш друг

2
ответ дан 14 December 2019 в 04:30
поделиться
Другие вопросы по тегам:

Похожие вопросы: