簡體   English   中英

XmlSerializer-將不同元素反序列化為同一元素的集合

[英]XmlSerializer - Deserialize different elements as collection of same element

我有以下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類可以嗎?

您可以將多個XmlElement與一個屬性一起使用:

[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;}

如果不允許您更改架構,則該架構很有可能不會更改。 (如果這不是一個有效的假設,請讓我知道。)在這種情況下,使用XmlSerializer可能會過大。 為什么不使用Linq到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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM