Convertir une chaîne XML en object

Je reçois des chaînes XML sur un socket et souhaite les convertir en objects C #.

Les messages sont de la forme:

 1 stop  

Je suis nouveau sur .Net, et je ne suis pas sûr de la meilleure pratique pour l’exécuter. J’ai déjà utilisé JAXB for Java et je n’étais pas sûr qu’il y ait quelque chose de similaire, ou si cela serait traité différemment.

Vous devez utiliser l’outil xsd.exe qui est installé avec le Kit de développement 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 

Et sur les ordinateurs Windows 10:

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

Lors de la première exécution, vous utilisez xsd.exe et vous convertissez votre exemple XML en fichier XSD (fichier de schéma XML):

 xsd yourfile.xml 

Cela vous donne votre yourfile.xsd , qui dans une deuxième étape, vous pouvez convertir à nouveau en utilisant xsd.exe dans une classe C #:

 xsd yourfile.xsd /c 

Cela devrait vous donner un 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(new XmlTextReader("yourfile.xml")); 

Devrait fonctionner assez bien pour la plupart des cas.

Mise à jour: le sérialiseur XML prendra tout stream en entrée – un fichier ou un stream de mémoire conviendra:

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

ou utilisez un SsortingngReader:

 XmlSerializer serializer = new XmlSerializer(typeof(msg)); SsortingngReader rdr = new SsortingngReader(inputSsortingng); msg resultingMessage = (msg)serializer.Deserialize(rdr); 

Vous avez deux possibilités.

Méthode 1. Outil XSD


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

  1. Ouvrir l’ invite de commande du développeur
    Vous pouvez le trouver dans le Start Menu > Programs > Microsoft Visual Studio 2012 > Visual Studio Tools Si Windows 8 peut simplement commencer à taper Invite de commande du développeur dans l’ écran Démarrer
  2. Modifiez l’emplacement dans votre répertoire de fichiers XML en tapant cd /D "C:\path\to\xml"
  3. Créer un 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 d’un fichier xml dans C:\path\to\xml\file.cs

Méthode 2 – Collage spécial


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

  1. Copier le contenu de votre fichier XML dans le presse papier
  2. Ajouter à votre solution un nouveau fichier de classe vide ( Maj + Alt + C )
  3. Ouvrez ce fichier et dans le menu cliquez sur Edit > Paste special > Paste XML As Classes
    entrer la description de l'image ici

Et c’est tout!

Usage


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 ssortingng @this) { var stream = new MemoryStream(); var writer = new StreamWriter(stream); writer.Write(@this); writer.Flush(); stream.Position = 0; return stream; } public static T ParseXML(this ssortingng @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(this ssortingng @this) where T : class { return JSON.Deserialize(@this.Trim()); } } } 

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

  public class JSONRoot { public catalog catalog { get; set; } } // ... ssortingng xml = File.ReadAllText(@"D:\file.xml"); var catalog1 = xml.ParseXML(); ssortingng json = File.ReadAllText(@"D:\file.json"); var catalog2 = json.ParseJSON(); 

Essayez cette méthode pour convertir le fichier XML en object. Il est fait pour exactement ce que vous faites:

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

Appelez-le en utilisant ce code:

 YourStrongTypedEntity entity = FromXml(YourMsgSsortingng); 

Il vous suffit d’exécuter Visual Studio 2013 en tant qu’administration … Copiez le contenu de votre fichier XML. Accédez à Visual Studio 2013> Édition> Collage spécial> Coller le fichier XML en tant que classes C # Il créera vos classes c # en fonction du contenu de votre fichier XML.

Juste au cas où quelqu’un pourrait trouver cela utile:

 public static class XmlConvert { public static ssortingng SerializeObject(T dataObject) { if (dataObject == null) { return ssortingng.Empty; } try { using (SsortingngWriter ssortingngWriter = new System.IO.SsortingngWriter()) { var serializer = new XmlSerializer(typeof(T)); serializer.Serialize(ssortingngWriter, dataObject); return ssortingngWriter.ToSsortingng(); } } catch (Exception ex) { return ssortingng.Empty; } } public static T DeserializeObject(ssortingng xml) where T : new() { if (ssortingng.IsNullOrEmpty(xml)) { return new T(); } try { using (var ssortingngReader = new SsortingngReader(xml)) { var serializer = new XmlSerializer(typeof(T)); return (T)serializer.Deserialize(ssortingngReader); } } catch (Exception ex) { return new T(); } } } 

Vous pouvez l’appeler en utilisant:

 MyCustomObject myObject = new MyCustomObject(); ssortingng xmlSsortingng = XmlConvert.SerializeObject(myObject) myObject = XmlConvert.DeserializeObject(xmlSsortingng); 

Vous pouvez utiliser xsd.exe pour créer des classes liées au schéma dans .Net, puis XmlSerializer pour désérialiser la chaîne: http://msdn.microsoft.com/en-us/library/system.xml.serialization.xmlserializer.deserialize.aspx

Vous pouvez générer la classe comme décrit ci-dessus ou les écrire manuellement:

 [XmlRoot("msg")] public class Message { [XmlElement("id")] public ssortingng Id { get; set; } [XmlElement("action")] public ssortingng Action { get; set; } } 

Vous pouvez ensuite utiliser ExtendedXmlSerializer pour sérialiser et désérialiser.

Instalation Vous pouvez installer ExtendedXmlSerializer à partir de nuget ou exécuter la commande suivante:

 Install-Package ExtendedXmlSerializer 

Sérialisation:

 var serializer = new ConfigurationContainer().Create(); var obj = new Message(); var xml = serializer.Serialize(obj); 

Désérialisation

 var obj2 = serializer.Deserialize(xml); 

Ce support de sérialiseur:

  • Désérialisation XML à partir de XMLSerializer standard
  • Classe de sérialisation, struct, classe générique, type primitif, liste générique et dictionnaire, tableau, énumération
  • Classe de sérialisation avec interface de propriété
  • Référence circulaire de référence de sérialisation et identifiant de référence
  • Désérialisation de l’ancienne version de xml
  • Cryptage de la propriété
  • Sérialiseur personnalisé
  • Prise en charge de XmlElementAtsortingbute et XmlRootAtsortingbute
  • POCO – toutes les configurations (migrations, sérialiseur personnalisé …) sont en dehors de la classe

ExtendedXmlSerializer prend en charge .NET 4.5 ou supérieur et .NET Core . Vous pouvez l’intégrer avec WebApi et AspCore.

Si vous avez le xsd du message XML, vous pouvez générer des classes c # à l’aide de l’outil .Net xsd.exe.

Ces classes .Net peuvent ensuite être utilisées pour générer le fichier XML.

En plus des autres réponses, vous pouvez naturellement utiliser la classe XmlDocument , pour la lecture XML-like, ou le XmlReader , lecteur rapide uniquement, pour le faire “à la main”.

Simplifier la bonne réponse de Damian,

 public static T ParseXml(this ssortingng value) where T : class { var xmlSerializer = new XmlSerializer(typeof(T)); using (var textReader = new SsortingngReader(value)) { return (T) xmlSerializer.Deserialize(textReader); } } 
 public ssortingng Serialize(T settings) { XmlSerializer serializer = new XmlSerializer(typeof(T)); SsortingngWriter outStream = new SsortingngWriter(); serializer.Serialize(outStream, settings); return outStream.ToSsortingng(); }