210 votes

Convertir la Chaîne de caractères XML pour Objet

Je suis la réception des chaînes XML sur une socket, et voudrais le convertir en objets C#.

Les messages sont de la forme:

<msg>
   <id>1</id>
   <action>stop</action>
</msg>

Je suis nouvelle dans .Net, et je ne suis pas certain de la meilleure pratique pour effectuer cette. J'ai utilisé JAXB pour Java avant, et il n'était pas sûr si il ya quelque chose de similaire, ou si cela serait géré d'une manière différente.

302voto

marc_s Points 321990

Vous devez utiliser l' xsd.exe outil qui est installé avec le kit de développement logiciel Windows dans un répertoire quelque chose de similaire à:

C:\Program Files\Microsoft SDKs\Windows\v6.0A\bin

Et sur les ordinateurs 64 bits:

C:\Program Files (x86)\Microsoft SDKs\Windows\v6.0A\bin

Lors de la première exécution, vous utilisez xsd.exe et vous convertissez votre exemple de code XML dans un fichier XSD (XML schema fichier):

xsd yourfile.xml

Cela vous donne yourfile.xsd, ce qui, dans une seconde étape, vous pouvez le convertir en utilisant à nouveau xsd.exe dans une classe C#:

xsd yourfile.xsd /c

Cela devrait vous donner une fichier yourfile.cs qui contiendra une classe C# que vous pouvez utiliser pour désérialiser le fichier XML que vous obtenez quelque chose comme:

XmlSerializer serializer = new XmlSerializer(typeof(msg));
msg resultingMessage = (msg)serializer.Deserialize('yourfile.xml');

Devrait fonctionner assez bien pour la plupart des cas.

Mise à jour: le sérialiseur XML prendra les flux en entrée - un fichier ou un flux de mémoire va être bien:

XmlSerializer serializer = new XmlSerializer(typeof(msg));
MemoryStream memStream = new MemoryStream(Encoding.UTF8.GetBytes(inputString));
msg resultingMessage = (msg)serializer.Deserialize(memStream);

ou utiliser un StringReader:

XmlSerializer serializer = new XmlSerializer(typeof(msg));
StringReader rdr = new StringReader(inputString);
msg resultingMessage = (msg)serializer.Deserialize(rdr);

263voto

Damian Drygiel Points 3230

Vous avez deux possibilités.

Méthode 1. XSD outil


Supposons que vous avez votre fichier XML dans cet emplacement C:\path\to\xml\file.xml

  1. Ouvrir Développeur Invite De Commande
    Vous pouvez le trouver en Start Menu > Programs > Microsoft Visual Studio 2012 > Visual Studio Tools Ou si vous avez Windows 8 pouvez commencer à taper le Développeur de l'Invite de Commande dans l' écran de Démarrage
  2. Modifier l'emplacement de votre fichier XML du répertoire en tapant cd /D "C:\path\to\xml"
  3. Créer le fichier XSD à partir de votre fichier xml en tapant xsd file.xml
  4. Créer des classes C# en tapant xsd /c file.xsd

Et c'est tout! Vous avez généré des classes C# à partir du fichier xml en C:\path\to\xml\file.cs

Méthode 2 - collage spécial


Requis Visual Studio 2012+.Net Framework >= 4.5 comme cible du projet

  1. Copier le contenu de votre fichier XML dans le presse-papiers
  2. Ajouter à votre solution nouvelle, vider le fichier de classe (Maj+Alt+C)
  3. Ouvrez ce fichier et dans le menu, cliquez sur Edit > Paste special > Paste XML As Classes
    enter image description here

Et c'est tout!

L'utilisation de la


L'utilisation est très simple avec cette classe d'assistance:

using System;
using System.IO;
using System.Web.Script.Serialization; // Add reference: System.Web.Extensions
using System.Xml;
using System.Xml.Serialization;

namespace Helpers
{
    internal static class ParseHelpers
    {
        private static JavaScriptSerializer json;
        private static JavaScriptSerializer JSON { get { return json ?? (json = new JavaScriptSerializer()); } }

        public static Stream ToStream(this string @this)
        {
            var stream = new MemoryStream();
            var writer = new StreamWriter(stream);
            writer.Write(@this);
            writer.Flush();
            stream.Position = 0;
            return stream;
        }


        public static T ParseXML<T>(this string @this) where T : class
        {
            var reader = XmlReader.Create(@this.Trim().ToStream(), new XmlReaderSettings() { ConformanceLevel = ConformanceLevel.Document });
            return new XmlSerializer(typeof(T)).Deserialize(reader) as T;
        }

        public static T ParseJSON<T>(this string @this) where T : class
        {
            return JSON.Deserialize<T>(@this.Trim());
        }
    }
}

Tout ce que vous avez à faire maintenant, c'est:

    public class JSONRoot
    {
        public catalog catalog { get; set; }
    }
    // ...

    string xml = File.ReadAllText(@"D:\file.xml");
    var catalog1 = xml.ParseXML<catalog>();

    string json = File.ReadAllText(@"D:\file.json");
    var catalog2 = json.ParseJSON<JSONRoot>();

55voto

RJ. Points 1392

Essayez cette méthode pour Convertir du Xml en un objet. Il est fait pour exactement ce que vous faites:

protected T FromXml<T>(String xml)
{
    T returnedXmlClass = default(T);

    try
    {
        using (TextReader reader = new StringReader(xml))
        {
            try
            {
                returnedXmlClass = 
                    (T)new XmlSerializer(typeof(T)).Deserialize(reader);
            }
            catch (InvalidOperationException)
            {
                // String passed is not XML, simply return defaultXmlClass
            }
        }
    }
    catch (Exception ex)
    {
    }

    return returnedXmlClass ;        
}

Appel à l'aide de ce code:

YourStrongTypedEntity entity = FromXml<YourStrongTypedEntity>(YourMsgString);

13voto

Fahad Points 1053

Vous pouvez utiliser linq to xml à cette fin

Envisager la suite de l'article http://www.switchonthecode.com/tutorials/introduction-to-linq-simple-xml-parsing

3voto

DaveShaw Points 19555

Vous pouvez utiliser xsd.exe pour créer liés à un schéma de classes .Net puis XmlSerializer pour Désérialiser la chaîne : http://msdn.microsoft.com/en-us/library/system.xml.serialization.xmlserializer.deserialize.aspx

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