Десериализация XML в объекты в C # - PullRequest
53 голосов
/ 22 октября 2008

Итак, у меня есть 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 ]

59 голосов
/ 22 октября 2008

Создайте класс для каждого элемента, который имеет свойство для каждого элемента и список или массив объектов (используйте созданный) для каждого дочернего элемента. Затем вызовите System.Xml.Serialization.XmlSerializer.Deserialize для строки и приведите результат в качестве объекта. Используйте атрибуты System.Xml.Serialization для внесения изменений, например, для сопоставления элемента с вашим классом ToDoList, используйте атрибут XmlElement ("todo-list").

Подсказка - это загрузить ваш XML в Visual Studio, нажать кнопку «Infer Schema» и запустить «xsd.exe / c schema.xsd» для генерации классов. xsd.exe находится в папке инструментов. Затем просмотрите сгенерированный код и внесите коррективы, например, при необходимости изменив шорты на целые.

35 голосов
/ 22 октября 2008

сводится к использованию 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;
}
15 голосов
/ 24 сентября 2012

Десериализация любого объекта, если тип T помечен как Сериализуемый:

function T Deserialize<T>(string serializedResults)
{
    var serializer = new XmlSerializer(typeof(T));
    using (var stringReader = new StringReader(serializedResults))
        return (T)serializer.Deserialize(stringReader);
}
4 голосов
/ 16 апреля 2010

Оформить заказ http://xsd2code.codeplex.com/

Xsd2Code - это генератор классов бизнес-сущностей CSharp или Visual Basic из схемы XSD.

4 голосов
/ 22 октября 2008

Что ж, в вашей сборке должны быть классы, которые примерно соответствуют XML (свойство с именем Private, свойство коллекции с именем ToDo и т. Д.).

Проблема в том, что в XML есть элементы, которые недопустимы для имен классов . Таким образом, вам нужно реализовать IXmlSerializable в этих классах, чтобы контролировать, как они сериализуются в и из XML. Возможно, вам также удастся обойтись без некоторых специфических атрибутов сериализации xml, но это зависит от схемы вашего xml.

Это шаг выше по сравнению с использованием отражения, но это может быть не совсем то, на что вы надеетесь.

3 голосов
/ 22 октября 2008

Вы должны взглянуть на http://www.canerten.com/xml-c-class-generator-for-c-using-xsd-for-deserialization/

Существует инструмент (Microsoft), который помогает создать необходимый XSD для правильной десериализации XML в объект

3 голосов
/ 22 октября 2008

Есть несколько вариантов.

  • Visual Studio включает программу командной строки под названием xsd.exe. Вы используете эту программу для создания документа схемы и снова используете программу в документе схемы для создания классов, которые вы можете использовать с system.xml.serialization.xmlserializer
  • Возможно, вы просто сможете вызвать Dataset.ReadXml () для него.
0 голосов
/ 24 сентября 2012

Несколько лет назад у меня были те же вопросы, что и при abt отображении xml в классы C # или создании классов C #, которые отображаются в наши XML, как мы это делаем в Entity Framework (мы отображаем таблицы в классы C #). Наконец, я создал фреймворк, который может создавать классы C # из вашего XML, и эти классы можно использовать для чтения / записи вашего xml. Иметь взгляд

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...