1

我有以下 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 类可以吗?

4

2 回答 2

4

您可以将多个 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;}
于 2012-03-09T06:07:05.127 回答
2

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

于 2010-05-20T15:19:00.597 回答