XmlSerializer - десериализация различных элементов как коллекции одного и того же элемента - PullRequest
1 голос
/ 20 мая 2010

У меня есть следующая часть XML, схему которой я не могу изменить. NUMBER, REGION, MENTION, FEDERAL - это столбцы:

<COLUMNS LIST="20" PAGE="1" INDEX="reg_id">
  <NUMBER WIDTH="3"/>
  <REGION WIDTH="60"/>
  <MENTION WIDTH="7"/>
  <FEDERAL WIDTH="30"/>
</COLUMNS>

Я хочу десериализовать это свойство public List<Column> Columns {get;set;}. Таким образом, имя элемента будет идти к Column.Name. Класс колонки:

public class Column
{
   //Name goes from Element Name
   public string Name {get;set;}
   [XmlAttribute("WIDTH")]
   public int Width {get;set;}
}

Возможно ли это с классом XmlSerializer?

Ответы [ 2 ]

4 голосов
/ 09 марта 2012

Вы можете использовать несколько XmlElements с одним свойством:

[XmlElement("NUMBER")]
[XmlElement("REGION")]
[XmlElement("MENTION")]
[XmlElement("FEDERAL")]
public List<Column> Columns {get;set;}

Можно даже указать разные классы для разных имен тегов:

[XmlElement(ElementName = "One", Type = typeof(OneItem))]
[XmlElement(ElementName = "Two", Type = typeof(TwoItem))]
public List<BaseItem> Items {get;set;}
2 голосов
/ 20 мая 2010

Если вам не разрешено изменять схему, скорее всего, схема не изменится. (Если это неверное предположение, пожалуйста, дайте мне знать.) В этом случае использование XmlSerializer может быть излишним. Почему бы не использовать Linq to XML?

class Program
{
    static void Main(string[] args)
    {
        XDocument doc = XDocument.Load(@".\Resources\Sample.xml");

        var columns = from column in doc.Descendants("COLUMNS").Descendants()
                      select new Column(column.Name.LocalName, int.Parse(column.Attribute("WIDTH").Value));

        foreach (var column in columns)
            Console.WriteLine(column.Name + " | " + column.Width);
    }

    class Column
    {
        public string Name { get; set; }
        public int Width { get; set; }

        public Column(string name, int width)
        {
            this.Name = name;
            this.Width = width;
        }
    }
}

Приведенный выше фрагмент кода загружает ваш образец XML, а затем создает из него перечисление столбцов. Просто и эффективно. Однако для этого требуется .NET 3.0 или более поздняя версия, поэтому, если это не вариант для вас, к сожалению, это не решение для вас.

Ссылка на документацию Microsoft Linq to XML:

http://msdn.microsoft.com/en-us/library/bb387098.aspx

...