it-swarm.dev

Převést řetězec XML na objekt

Přijímám řetězce XML přes soket a chtěl bych je převést na objekty C #.

Zprávy jsou formuláře:

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

Jsem nová. Net, a nejsem si jistý, nejlepší praxe pro provádění tohoto. Předtím jsem použil JAXB pro Javu a nebyl jsem si jistý, jestli existuje něco podobného, ​​nebo jestli by to bylo řešeno jiným způsobem.

139
Steve

Musíte použít nástroj xsd.exe, který se nainstaluje s Windows SDK do adresáře, který je podobný: 

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

A na 64bitových počítačích:

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

A na počítačích se systémem Windows 10:

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

Při prvním spuštění použijete xsd.exe a vzorek XML převedete do souboru XSD (soubor schématu XML):

xsd yourfile.xml

To vám dá yourfile.xsd, které ve druhém kroku můžete znovu převést pomocí xsd.exe do třídy C #:

xsd yourfile.xsd /c

To by vám mělo dát soubor yourfile.cs, který bude obsahovat třídu C #, kterou můžete použít k deserializaci získaného souboru XML - něco jako:

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

Mělo by fungovat docela dobře pro většinu případů.

Aktualizace: serializátor XML vezme jakýkoli proud jako svůj vstup - buď soubor nebo paměťový proud bude v pořádku:

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

nebo použijte StringReader:

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

Zkuste tuto metodu převést XML na objekt. Je vyrobeno přesně podle toho, co děláte:

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

Volejte pomocí tohoto kódu:

YourStrongTypedEntity entity = FromXml<YourStrongTypedEntity>(YourMsgString);
41
RJ.

Jednoduše spusťte Visual Studio 2013 jako Správa ... Zkopírujte obsah vašeho souboru Xml .. Přejděte do Visual Studio 2013> Upravit> Vložit jinak> Vložit Xml jako třídy C Vytvoří vaše třídy c # podle obsahu souboru Xml. 

8
user2667652

Pro případ, že by to někdo mohl považovat za užitečné:

public static class XmlConvert
{
    public static string SerializeObject<T>(T dataObject)
    {
        if (dataObject == null)
        {
            return string.Empty;
        }
        try
        {
            using (StringWriter stringWriter = new System.IO.StringWriter())
            {
                var serializer = new XmlSerializer(typeof(T));
                serializer.Serialize(stringWriter, dataObject);
                return stringWriter.ToString();
            }
        }
        catch (Exception ex)
        {
            return string.Empty;
        }
    }

    public static T DeserializeObject<T>(string xml)
         where T : new()
    {
        if (string.IsNullOrEmpty(xml))
        {
            return new T();
        }
        try
        {
            using (var stringReader = new StringReader(xml))
            {
                var serializer = new XmlSerializer(typeof(T));
                return (T)serializer.Deserialize(stringReader);
            }
        }
        catch (Exception ex)
        {
            return new T();
        }
    }
}

Můžete mu zavolat pomocí:

MyCustomObject myObject = new MyCustomObject();
string xmlString = XmlConvert.SerializeObject(myObject)
myObject = XmlConvert.DeserializeObject<MyCustomObject>(xmlString);
5
Razzer

Třídu můžete generovat tak, jak je popsáno výše, nebo je můžete zapsat ručně:

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

Pak můžete použít ExtendedXmlSerializer pro serializaci a deserializaci.

Instalaci Můžete nainstalovat ExtendedXmlSerializer z nuget nebo spustit následující příkaz:

Install-Package ExtendedXmlSerializer

Serializace:

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

Deserializace

var obj2 = serializer.Deserialize<Message>(xml);

Tato podpora serializátoru:

  • Deserializace xml ze standardního XMLSerializeru
  • Třída serializace, struct, generická třída, primitivní typ, obecný seznam a slovník, pole, enum
  • Třída serializace s rozhraním vlastností
  • Sériolizační kruhová reference a reference Id
  • Deserializace staré verze xml
  • Šifrování vlastností
  • Vlastní serializátor
  • Podpora XmlElementAttribute a XmlRootAttribute
  • POCO - všechny konfigurace (migrace, vlastní serializátor ...) jsou mimo třídu

Podpora ExtendedXmlSerializer .NET 4.5 nebo vyšší a .NET Core. Můžete jej integrovat s WebApi a AspCore. 

2
Wojtpl2

Xsd.exe můžete použít k vytvoření schématu vázané třídy v .Net pak XmlSerializer Deserialize řetězec: http://msdn.Microsoft.com/en-us/library/system.xml.serialization.xmlserializer.deserialize.aspx

2
DaveShaw

Máte-li xsd zprávy xml, můžete vygenerovat třídy c # pomocí nástroje .x xdd.exe.

Tyto třídy .Net pak mohou být použity ke generování XML.

0
Amitabh

Kromě dalších odpovědí zde můžete přirozeně použít XmlDocument class, pro XML DOM-like čtení, nebo XmlReader , čtečka rychlého převíjení vpřed - to udělat "ručně".

0
Skurmedel

Zjednodušení Damianovy skvělé odpovědi,

public static T ParseXml<T>(this string value) where T : class
{
    var xmlSerializer = new XmlSerializer(typeof(T));
    using (var textReader = new StringReader(value))
    {
        return (T) xmlSerializer.Deserialize(textReader);
    }
}
0
Sam Jazz

Další způsob, jak rozšířit xsd na c # třídy generování Nástroje: xsd2code.com. Tento nástroj je velmi praktický a výkonný. Má mnohem více přizpůsobení než nástroj xsd.exe z aplikace Visual Studio. Xsd2Code ++ lze přizpůsobit pro použití seznamů nebo polí a podporuje velká schémata s množstvím příkazů pro import.

Poznámka k některým funkcím,

  • Generuje obchodní objekty z XSD schématu nebo XML souboru na flexibilní C # Nebo kód jazyka.
  • Rámec podpory 2.0 až 4.x
  • Podpora silné typové kolekce (List, ObservableCollection, MyCustomCollection).
  • Podporovat automatické vlastnosti.
  • Generovat metody čtení a zápisu XML (serializace/deserializace).
  • Databinding podpora (WPF, Xamarin).
  • WCF (atribut DataMember).
  • Podpora kódování XML (UTF-8/32, ASCII, Unicode, Custom).
  • Velbloudí případ/Pascal Case support.
  • podpora omezení ([StringLengthAttribute = true/false], [RegularExpressionAttribute = true/false], [RangeAttribute = true/false]).
  • Podpora velkých a složitých souborů XSD.
  • Podpora DotNet Core & standard
0
Haas Franck