Десериализация 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 ответов:
создать класс для каждого элемента, который имеет свойство для каждого элемента и список или массив объектов (созданных) для каждого дочернего элемента. Затем вызовите систему.XML.Сериализация.XmlSerializer.Десериализуйте строку и приведите результат в качестве объекта. использовать систему.XML.Атрибуты сериализации для внесения изменений, например для сопоставления элемента с классом ToDoList, используйте атрибут XmlElement("todo-list").
shourtcut-это загрузка XML в Visual Studio, нажмите кнопка " вывести схему "и запустить" xsd.схема exe/C.xsd " для генерации классов. XSD-файл.exe находится в папке tools. Затем пройдите через сгенерированный код и внесите коррективы, например, измените шорты на ints, где это необходимо.
сводится к использованию 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); }
Ну, у вас должны быть классы в вашей сборке, которые примерно соответствуют XML (свойство называется Private, свойство коллекции называется ToDo и т. д.).
проблема в том, что XML имеет элементы, которые недопустимы для имен классов. Таким образом, вам придется реализовать IXmlSerializable в этих классах, чтобы контролировать, как они сериализуются в XML и из XML. Возможно, Вам удастся уйти с использованием некоторых атрибутов XML-сериализации, но это зависит от схема вашего xml.
Это шаг выше, используя отражение, но это может быть не совсем то, что вы надеетесь.
проверка http://xsd2code.codeplex.com/
Xsd2Code это используется CSharp или визуальный основной субъект предпринимательской деятельности класса генератор из xsd-схемы.
есть несколько различных вариантов.
- Visual Studio включает в себя программу командной строки под названием xsd.исполняемый. Вы используете эту программу для создания документа схемы и снова используете программу в документе схемы для создания классов, которые можно использовать с
system.xml.serialization.xmlserializer
- возможно, вы просто сможете вызвать Dataset.ReadXml () на нем.
вы должны взглянуть на http://www.canerten.com/xml-c-class-generator-for-c-using-xsd-for-deserialization/
есть инструмент (Microsoft), который помогает создать необходимый XSD для правильной десериализации XML в объект
У меня были те же вопросы несколько лет назад, что и о том, как сопоставлять xml с классами C# или создавать классы C#, которые сопоставляются с нашими XMLs, jst, как мы делаем в Entity Framework (мы сопоставляем таблицы с классами C#). Наконец, я создал фреймворк, который может создавать классы C# из вашего XML, и эти классы можно использовать для чтения/записи вашего xml. Есть посмотреть