Десериализация XML в объекты в C#
Итак, у меня есть XML, который выглядит так:
<todo-list>
<id type="integer">#{id}</id>
<name>#{name}</name>
<description>#{description}</description>
<project-id type="integer">#{project_id}</project-id>
<milestone-id type="integer">#{milestone_id}</milestone-id>
<position type="integer">#{position}</position>
<!-- if user can see private lists -->
<private type="boolean">#{private}</private>
<!-- if the account supports time tracking -->
<tracked type="boolean">#{tracked}</tracked>
<!-- if todo-items are included in the response -->
<todo-items type="array">
<todo-item>
...
</todo-item>
<todo-item>
...
</todo-item>
...
</todo-items>
</todo-list>
Как мне использовать библиотеку сериализации.NET для десериализации этого в объекты C#?
В настоящее время я использую отражение и отображаю между xml и моими объектами, используя соглашения об именах.
8 ответов
Создайте класс для каждого элемента, который имеет свойство для каждого элемента и список или массив объектов (используйте созданный) для каждого дочернего элемента. Затем вызовите System.Xml.Serialization.XmlSerializer.Deserialize для строки и приведите результат в качестве объекта. Используйте атрибуты System.Xml.Serialization для внесения корректировок, например, для сопоставления элемента с вашим классом ToDoList, используйте атрибут XmlElement("todo-list").
Сочетание клавиш - это загрузить ваш XML в Visual Studio, нажать кнопку "Infer Schema" и запустить "xsd.exe /c schema.xsd" для генерации классов. xsd.exe находится в папке инструментов. Затем просмотрите сгенерированный код и внесите коррективы, например, при необходимости изменив шорты на целые.
Сводится к использованию xsd.exe из инструментов в VS:
xsd.exe "%xsdFile%" /c /out:"%outDirectory%" /l:"%language%"
Затем загрузите его с помощью ридера и десериализатора:
public GeneratedClassFromXSD GetObjectFromXML()
{
var settings = new XmlReaderSettings();
var obj = new GeneratedClassFromXSD();
var reader = XmlReader.Create(urlToService, settings);
var serializer = new System.Xml.Serialization.XmlSerializer(typeof(GeneratedClassFromXSD));
obj = (GeneratedClassFromXSD)serializer.Deserialize(reader);
reader.Close();
return obj;
}
Десериализовать любой объект, пока тип T
помечен как Сериализуемый:
function T Deserialize<T>(string serializedResults)
{
var serializer = new XmlSerializer(typeof(T));
using (var stringReader = new StringReader(serializedResults))
return (T)serializer.Deserialize(stringReader);
}
Оформить заказ http://xsd2code.codeplex.com/
Xsd2Code - это генератор классов бизнес-сущностей CSharp или Visual Basic из схемы XSD.
Ну, вам нужно иметь классы в вашей сборке, которые примерно соответствуют XML (свойство с именем Private, свойство коллекции с именем ToDo и т. Д.).
Проблема в том, что в XML есть элементы, которые недопустимы для имен классов. Таким образом, вам нужно реализовать IXmlSerializable в этих классах, чтобы контролировать, как они сериализуются в и из XML. Возможно, вам удастся обойтись и в использовании некоторых специфических атрибутов сериализации xml, но это зависит от схемы вашего xml.
Это на шаг выше при использовании отражения, но это может быть не совсем то, на что вы надеетесь.
Есть пара разных вариантов.
- Visual Studio включает программу командной строки под названием xsd.exe. Вы используете эту программу для создания документа схемы и снова используете программу в документе схемы для создания классов, которые вы можете использовать с
system.xml.serialization.xmlserializer
- Вы можете просто вызвать Dataset.ReadXml() для него.
Вы должны взглянуть на http://www.canerten.com/xml-c-class-generator-for-c-using-xsd-for-deserialization/
Существует (Microsoft) инструмент, который помогает создать необходимый XSD для правильной десериализации XML в объект
Несколько лет назад у меня были те же вопросы о том, как abt отображать xml в классы C# или создавать классы C#, которые сопоставляются с нашими XML-файлами, так же, как мы это делаем в Entity Framework (мы отображаем таблицы в классы C#). Наконец, я создал фреймворк, который может создавать классы C# из вашего XML, и эти классы можно использовать для чтения / записи вашего xml. Посмотри