2010-05-20 44 views
1

我有以下XML部分,我无法更改该模式。号,地区,何况,联邦是列:XmlSerializer - 将不同元素反序列化为同一元素的集合

<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

如果您不允许更改模式,那么架构更可能不会更改。 (如果这不是一个有效的假设,请让我知道。)在这种情况下,使用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或更高版本,所以如果这不是您的选择,那么不幸的是这不是您的解决方案。

链接到微软的LINQ到XML文档:

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

+1

好主意。如果Linq-to-XML由于某种原因不合需要,可以使用XPath。 – 2010-05-20 16:24:19

+0

非常好的一点! XPath与Linq to XML非常相似,XPath不需要.NET 3.0及更高版本。 – 2010-05-20 16:40:09

3

您可以使用多个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;} 
相关问题