Подтвердить что ты не робот

Дессериализация XML для объектов в С#

Итак, у меня есть 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 для десериализации этого объекта в С#?

В настоящее время я использую отражение, и я сопоставляю между xml и моими объектами, используя соглашения об именах.

4b9b3361

Ответ 1

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

Вызов для загрузки вашего XML в Visual Studio, нажмите кнопку "Infer Schema" и запустите "xsd.exe/c schema.xsd" для создания классов. xsd.exe находится в папке с инструментами. Затем перейдите к сгенерированному коду и внесите корректировки, например, при необходимости замените шорты на int.

Ответ 2

Сбрасывает использование 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;
}

Ответ 3

десериализовать любой объект, если тип T отмечен Serializable:

function T Deserialize<T>(string serializedResults)
{
    var serializer = new XmlSerializer(typeof(T));
    using (var stringReader = new StringReader(serializedResults))
        return (T)serializer.Deserialize(stringReader);
}

Ответ 4

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

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

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

Ответ 5

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

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

Ответ 6

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

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

Ответ 8

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