web-dev-qa-db-fra.com

Désérialisation de XML en objets en C #

J'ai donc du xml qui ressemble à ceci:

<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>

Comment pourrais-je utiliser la bibliothèque de sérialisation de .NET pour désérialiser cela en objets C #?

Actuellement, j'utilise la réflexion et je mappe entre le xml et mes objets en utilisant les conventions de dénomination.

53
Justin Bozonier

Créez une classe pour chaque élément qui a une propriété pour chaque élément et une liste ou un tableau d'objets (utilisez celui créé) pour chaque élément enfant. Appelez ensuite System.Xml.Serialization.XmlSerializer.Deserialize sur la chaîne et transformez le résultat en objet. Utilisez les attributs System.Xml.Serialization pour effectuer des ajustements, comme pour mapper l'élément à votre classe ToDoList, utilisez l'attribut XmlElement ("todo-list").

Un raccourci consiste à charger votre XML dans Visual Studio, à cliquer sur le bouton "Inférer le schéma" et à exécuter "xsd.exe/c schema.xsd" pour générer les classes. xsd.exe se trouve dans le dossier tools. Parcourez ensuite le code généré et effectuez des ajustements, tels que le remplacement des courts métrages en pouces, le cas échéant.

59
Dan Goldstein

Se résume à utiliser xsd.exe à partir d'outils dans VS:

xsd.exe "%xsdFile%" /c /out:"%outDirectory%" /l:"%language%"

Ensuite, chargez-le avec lecteur et désérialiseur:

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;
}
35
Steve Horn

Désérialiser tout objet, tant que le type T est marqué Sérialisable:

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

Eh bien, vous devez avoir dans votre assembly des classes qui correspondent, à peu près, au XML (propriété appelée Private, propriété de collection appelée ToDo, etc.).

Le problème est que le XML contient des éléments non valides pour les noms de classe. Vous devez donc implémenter IXmlSerializable dans ces classes pour contrôler la façon dont ils sont sérialisés vers et depuis XML. Vous pourrez peut-être aussi utiliser certains des attributs spécifiques à la sérialisation XML, mais cela dépend du schéma de votre XML.

C'est une étape au-dessus de l'utilisation de la réflexion, mais ce n'est peut-être pas exactement ce que vous espérez.

4
Will

Commander http://xsd2code.codeplex.com/

Xsd2Code est un générateur de classe CSharp ou Visual Basic Business Entity à partir du schéma XSD.

4
Deepfreezed

Il existe plusieurs options différentes.

  • Visual Studio inclut un programme en ligne de commande appelé xsd.exe. Vous utilisez ce programme pour créer un document de schéma et utilisez à nouveau le programme sur le document de schéma pour créer des classes que vous pouvez utiliser avec system.xml.serialization.xmlserializer
  • Vous pouvez peut-être simplement appeler Dataset.ReadXml () dessus.
3
Joel Coehoorn

Vous devriez jeter un œil à http://www.canerten.com/xml-c-class-generator-for-c-using-xsd-for-deserialization/

Il existe un outil (Microsoft) qui aide à créer le XSD nécessaire pour désérialiser correctement XML en un objet

3
Luk