XmlSerializer – 将不同的元素反序列化为相同元素的集合

我有以下XML部分,我无法更改架构。 NUMBER,REGION,MENTION,FEDERAL是列:

      

我想将它反序列化为public List 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类?

如果不允许更改架构,则架构更可能不会更改。 (如果这不是一个有效的假设,请告诉我。)在这种情况下,使用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; } } } 

上面的snippit加载您的示例XML,然后从中创建列的枚举。 简单有效。 但是,这需要.NET 3.0或更高版本,所以如果这不是您的选择,那么不幸的是,这不是您的解决方案。

Microsoft的Linq to XML文档的链接:

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

您可以将多个XmlElements与一个属性一起使用:

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

甚至可以为不同的标签名称指定不同的类:

 [XmlElement(ElementName = "One", Type = typeof(OneItem))] [XmlElement(ElementName = "Two", Type = typeof(TwoItem))] public List Items {get;set;}