Десериализация 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 52

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. Есть посмотреть