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.
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.
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;
}
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);
}
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.
Commander http://xsd2code.codeplex.com/
Xsd2Code est un générateur de classe CSharp ou Visual Basic Business Entity à partir du schéma XSD.
Il existe plusieurs options différentes.
system.xml.serialization.xmlserializer
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