Converti stringa XML in oggetto

Converti stringa XML in oggetto

Devi usare il xsd.exe strumento che viene installato con Windows SDK in una directory simile a:

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

E sui computer a 64 bit:

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

E sui computer Windows 10:

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

Alla prima esecuzione, usi xsd.exe e converti il ​​tuo XML di esempio in un file XSD (file schema XML):

xsd yourfile.xml

Questo ti dà yourfile.xsd , che in un secondo momento potrai convertire nuovamente utilizzando xsd.exe in una classe C#:

xsd yourfile.xsd /c

Questo dovrebbe darti un file yourfile.cs che conterrà una classe C# che puoi utilizzare per deserializzare il file XML che stai ricevendo, qualcosa del tipo:

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

Dovrebbe funzionare abbastanza bene per la maggior parte dei casi.

Aggiornamento: il serializzatore XML prenderà qualsiasi flusso come input:un file o un flusso di memoria andrà bene:

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

oppure usa un StringReader:

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

Hai due possibilità.

Metodo 1. XSD strumento

Supponi di avere il tuo file XML in questa posizione C:\path\to\xml\file.xml

  1. Apri Prompt dei comandi per gli sviluppatori
    Puoi trovarlo in Start Menu > Programs > Microsoft Visual Studio 2012 > Visual Studio Tools Oppure, se hai Windows 8, puoi semplicemente iniziare a digitare Prompt dei comandi per sviluppatori nella Schermata iniziale
  2. Cambia la posizione nella directory del tuo file XML digitando cd /D "C:\path\to\xml"
  3. Crea file XSD dal tuo file xml digitando xsd file.xml
  4. Crea classi C# digitando xsd /c file.xsd

E questo è tutto! Hai generato classi C# dal file xml in C:\path\to\xml\file.cs

Metodo 2 - Incolla speciale

Richiesto Visual Studio 2012+ con .Net Framework>=4.5 come destinazione del progetto e il singolo componente "Windows Communication Foundation" installato

  1. Copia il contenuto del tuo file XML negli appunti
  2. Aggiungi alla tua soluzione un nuovo file di classe vuoto (Shift +Alt +C )
  3. Apri quel file e nel menu fai clic su Edit > Paste special > Paste XML As Classes

E questo è tutto!

Utilizzo

L'utilizzo è molto semplice con questa classe di supporto:

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());
        }
    }
}

Tutto quello che devi fare ora è:

    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>();

Prova questo metodo per convertire XML in un oggetto. È fatto esattamente per quello che stai facendo:

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 ;        
}

Chiamalo usando questo codice:

YourStrongTypedEntity entity = FromXml<YourStrongTypedEntity>(YourMsgString);