我有以下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类?
答案 0 :(得分: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;}
答案 1 :(得分: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或更高版本,所以如果这不适合您,那么不幸的是,这不适合您。
Microsoft的Linq to XML文档的链接: