54 votes

Deserializing XML to Objects in C #

J'ai donc 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 .NET pour la désérialiser 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.

59voto

Dan Goldstein Points 8940

Créer une classe pour chaque élément qui a une propriété pour chaque élément et une Liste ou un Tableau d'objets (utilisation de l'créé un) pour chaque élément enfant. Ensuite, Système d'appel.Xml.La sérialisation.XmlSerializer.Désérialiser sur la chaîne et convertir le résultat en tant que votre objet. Utiliser le Système.Xml.Attributs de la sérialisation pour faire des ajustements, comme cartographier l'élément de votre ToDoList classe, utilisez le XmlElement("todo-list") de l'attribut.

Un shourtcut est de charger votre document XML dans Visual Studio, cliquez sur le "Déduire du Schéma" bouton "xsd.exe /c schéma.xsd" pour générer les classes. xsd.exe est dans le dossier outils. Ensuite, passez par le code généré et faire des ajustements, tels que l'évolution des shorts à ints, le cas échéant.

37voto

Steve Horn Points 2905

Instructions ici

Cela revient à utiliser xsd.exe à partir des outils dans VS:

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

Puis chargez-le avec le lecteur et le 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;
}
 

15voto

Keith Points 5138

Désérialisez n'importe quel objet, tant que le type est marqué Serializable:

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

    var obj = (T)serializer.Deserialize(stringReader);
    stringReader.Dispose();

    return obj;
}
 

4voto

Will Points 76760

Eh bien, vous devez avoir des cours dans votre assemblée qui correspondent, en gros, le XML (propriété Privée, une collection de propriété appelée ToDo, etc).

Le problème est que le XML a des éléments qui ne sont pas valides pour les noms de classe. De sorte que vous auriez à mettre en œuvre IXmlSerializable dans ces classes pour contrôler la façon dont ils sont sérialisés et de XML. Vous pourriez être en mesure de s'en tirer avec l'aide de certains de la sérialisation xml attributs spécifiques en tant que bien, mais cela dépend de votre xml schéma.

C'est une étape au-dessus de l'aide de la réflexion, mais il pourrait ne pas être exactement ce que vous espérez pour.

4voto

Deepfreezed Points 283

Commander http://xsd2code.codeplex.com/

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X