我有一些XML,我想将其序列化为一个类。
<Group>
<Employees>
<Employee>
<Name>Hari</Name>
<Age>30</Age>
</Employee>
<Employee>
<Name>Yougov</Name>
<Age>31</Age>
</Employee>
<Employee>
<Name>Adrian</Name>
<Age>28</Age>
</Employee>
</Employees >
上述XML可以很容易地在C#中实现。 但我偶然发现了我的要求,即XML的样子,
<Group>
<Employees>
<Hari Age=30 />
<Yougov Age=31 />
<Adrian Age=28 />
</Employees >
</Group>
员工是List<Employee>
KeyValuePair<string, int>("Hari", 30)
如何设计类和成员变量以获取上面的序列化XML? (如果员工名单中没有任何重复的名称)
非常感谢任何帮助。
答案 0 :(得分:3)
在你的情况下,我会选择Linq2Xml。
XDocument xDoc = XDocument.Load(......);
var emps = xDoc.Descendants("Employees").Elements()
.Select(x => new Employee() {
Name = x.Name.ToString(),
Age = int.Parse(x.Attribute("Age").Value)
})
.ToList();
PS:Age=30
无效。它应该是Age="30"
答案 1 :(得分:1)
将数据用作架构并不是一个好主意;特别是,很多名称无效作为xml元素名称,但是:它只是不好的做法(例如,它使它在模式验证方面几乎无用)。如果你想要简洁,可能会像:
<Employees>
<Add Name="Hari" Age="30" />
</Employees>
或
<Employees>
<Employee Name="Hari" Age="30" />
</Employees>
可以简单地用:
完成[XmlArray("Employees"), XmlArrayItem("Employee")]
public List<Employee> Employees {get;set;}
和
public class Employee {
[XmlAttribute]
public string Name {get;set;}
[XmlAttribute]
public int Age {get;set;}
}
XmlSerializer
不支持“内容作为元素名称”序列化程序,除非您使用父元素中的IXmlSerializable
自行完成所有操作 (它必须来自父母,因为XmlSerializer
无法识别要在那里处理的孩子。)