我有一个包含数据行的DataTable。我有一个类,其属性与行列名匹配。
如何从DataTable Row信息中填充List?
我是否调用类似(MyType)的新XmlSerializer(typeof(MyType))。反序列化(new XMLReader(Table.WriteXML()));
答案 0 :(得分:2)
我建议编写类来执行此转换,而不是使用XML序列化,这需要大量额外的工作,并且将对象与数据模型紧密联系在一起。
另一方面,有时您只需要从XML反序列化集合。要做到这一点,您需要做的就是告诉 XmlSerializer
将哪个节点映射到集合。
默认情况下,DataTable.WriteXml
会创建一个名为<DocumentElement>
的根元素。例如,如果您从名为“名称”的DataTable
写入“FirstName”和“LastName”列,您将得到:
<DocumentElement>
<Name>
<FirstName>Jon</FirstName>
<LastName>User</LastName>
</Name>
</DocumentElement>
问题是XmlSerializer
不知道应该将“DocumentElement”反序列化到您的集合类。有两种方法可以告诉它如何。
XmlSerializer
知道名为“ArrayOfMyClass”的根元素应该映射到MyClass
的集合。
将您的DataTable
添加到名为“ArrayOfMyClass”的DataSet
中,将其序列化为此...
<ArrayOfMyClass>
<MyClass>
// ... elements that map to properties of MyClass
</MyClass>
</ArrayOfMyClass>
....根据需要反序列化为List<MyClass>
。
作为替代方案,您可以这样做:
XmlRootAttribute root = new XmlRootAttribute("DocumentElement");
XmlSerializer serializer = new XmlSerializer(typeof(List<Name>), root);
假设其他一切正常(也就是说,您的数据行列名称与您的类属性名称匹配),这会按预期反序列化到您的List<MyClass>
。
编辑:请注意,此SO方法问题中描述的此方法存在相当严重的问题(具有适度繁琐的解决方法):XmlSerializer Performance Issue。
答案 1 :(得分:1)
如果我正确理解您的问题,您想将每行数据的字段放入YourClass的实例中,然后将实例存储在List中吗?
在这种情况下,最直接的方法是
create the List object
loop over the rows
create a new YourClass object
map the fields to the properties of the YourClass object
add the YourClass object to the list