Я рекомендую писать классы для выполнения этого преобразования вместо использования XML-сериализации, которая требует много дополнительной работы и слишком тесно связывает ваши объекты с вашей моделью данных.
С другой стороны, иногда вам просто нужно десериализовать коллекции из XML. Для этого все, что вам нужно сделать, это указать XmlSerializer
, какой узел сопоставить с коллекцией .
По умолчанию DataTable.WriteXml
создает корневой элемент с именем <DocumentElement>
. Например, если вы пишете из DataTable
с именем «Name», которое имеет столбцы «FirstName» и «LastName», вы получите следующее:
<DocumentElement>
<Name>
<FirstName>Jon</FirstName>
<LastName>User</LastName>
</Name>
</DocumentElement>
Проблема в том, что XmlSerializer
не знает, что DocumentElement должен быть десериализован в ваш класс коллекции. Есть два способа сказать, как это сделать.
По соглашению
XmlSerializer
знает, что корневой элемент с именем "ArrayOfMyClass" должен отображаться в коллекции MyClass
.
Добавьте ваш DataTable
к DataSet
с именем "ArrayOfMyClass", чтобы сериализовать его следующим образом ...
<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 .