web-dev-qa-db-fra.com

Comment mapper XML à des objets C #

J'ai un XML que je veux charger dans des objets, manipuler ces objets (définir des valeurs, lire des valeurs), puis sauvegarder ces XML. Il est important pour moi d'avoir le XML dans la structure (xsd) que j'ai créée.

Une façon de le faire est d'écrire mon propre sérialiseur, mais y a-t-il une prise en charge intégrée ou open source en C # que je peux utiliser?

28
Ragoler

Vous pouvez générer des classes C # sérialisables à partir d'un schéma (xsd) à l'aide de xsd.exe:

xsd.exe dependency1.xsd dependency2.xsd schema.xsd /out:outputDir

Si le schéma a des dépendances (schémas inclus/importés), ils doivent tous être inclus sur la même ligne de commande.

28
ckarras

Ce code (à partir de C # DotNet 1.0) fonctionne très bien pour sérialiser la plupart des objets en XML. (et retour) Cela ne fonctionne pas pour les objets contenant des ArrayLists, et si possible, n'utilisez que des tableaux

using System;    
using System.IO;
using System.Text;
using System.Xml.Serialization;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Formatters.Binary;


public static string Serialize(object objectToSerialize)
{
    MemoryStream mem = new MemoryStream();          
    XmlSerializer ser = new XmlSerializer(objectToSerialize.GetType());         
    ser.Serialize(mem, objectToSerialize);                      
    ASCIIEncoding ascii = new ASCIIEncoding();
    return ascii.GetString(mem.ToArray());
}        

public static object Deserialize(Type typeToDeserialize, string xmlString)
{
    byte[] bytes = Encoding.UTF8.GetBytes(xmlString);
    MemoryStream mem = new MemoryStream(bytes);         
    XmlSerializer ser = new XmlSerializer(typeToDeserialize);
    return ser.Deserialize(mem);
}
18
Poltergoose

LINQ to XML est très puissant si vous utilisez .net 3.5, LINQ to XSD peut également vous être utile!

7
ljs

Utilisez le programme de ligne de commande xsd.exe fourni avec Visual Studio pour créer des fichiers de classe que vous pouvez utiliser dans votre projet/solution et l'espace de noms System.Xml.Serialization (en particulier, la classe XmlSerializer) pour sérialiser/désérialiser ces classes vers et depuis disque.

2
Joel Coehoorn

using System.Xml.Serialization; cet espace de noms possède tous les attributs dont vous aurez besoin si vous souhaitez mapper votre xml à n'importe quel objet aléatoire. Vous pouvez également utiliser l'outil xsd.exe

fichier xsd.xsd {/ classes |/dataset} [/ element: element] [/ language: language] [/ namespace: namespace] [/ outputdir: directory] [URI: uri] qui prendra vos fichiers xsd et en créera des classes c # ou vb.net.

http://msdn.Microsoft.com/en-us/library/x6c1kb0s (VS.71) .aspx

2
chris.w.mclean

Nous avons créé un framework qui peut générer automatiquement des classes C # à partir de votre XML. C'est un modèle d'élément visuel auquel vous passez votre XML et les classes sont générées automatiquement dans votre projet. En utilisant ces classes, vous pouvez créer/lire/écrire votre XML.

Vérifiez ce lien pour le cadre et le modèle d'élément Visual C #: cliquez ici

1
Savaratkar

xsd.exe de Microsoft a beaucoup de bugs: | Essayez cette perle open source http://xsd2code.codeplex.com/

1
binball

Je suis d'accord que xsd est vraiment de la merde ... Mais ils ont fait une autre version que presque personne ne connaît. Son générateur d'objet appelé xsd. C'est la prochaine version et a bien plus d'options. Il génère des fichiers à partir de XSD et fonctionne de manière fantastique. Si vous avez un générateur de schéma comme un espion XML; créez un xsd à partir de votre xml et utilisez cet outil. J'ai créé des classes très très complexes en utilisant cet outil. Ensuite, créez des classes partielles pour des propriétés\méthodes supplémentaires, etc., puis lorsque vous mettez à jour votre schéma, vous régénérez simplement vos classes et toutes les modifications persistent dans vos classes partielles.

http://www.Microsoft.com/download/en/details.aspx?displaylang=en&id=7075

1
Steve Coleman

Je parie que NetDataContractSerializer peut faire ce que vous voulez.

0
dcstraw