2010-05-20 69 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;} 
相關問題