Konwertuj Łańcuch XML na obiekt
Otrzymuję łańcuchy XML nad gniazdem i chciałbym je przekonwertować na obiekty C#.
Wiadomości mają postać:
<msg>
<id>1</id>
<action>stop</action>
</msg>
Jestem nowy w. Net i nie jestem pewien, czy jest to najlepsza praktyka. Korzystałem już wcześniej z JAXB dla Javy i nie byłem pewien, czy istnieje coś podobnego, czy byłoby to obsługiwane w inny sposób.
11 answers
Musisz użyć narzędzia xsd.exe
, które zostanie zainstalowane z zestawem SDK systemu Windows w katalogu podobnym do:
C:\Program Files\Microsoft SDKs\Windows\v6.0A\bin
I na komputerach 64-bitowych:
C:\Program Files (x86)\Microsoft SDKs\Windows\v6.0A\bin
I na komputerach z systemem Windows 10:
C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\bin
Przy pierwszym uruchomieniu, używasz xsd.exe
i konwertujesz swój przykładowy XML do pliku XSD (XML schema file):
xsd yourfile.xml
Daje to yourfile.xsd
, które w drugim kroku można przekształcić ponownie używając xsd.exe
do klasy C#:
xsd yourfile.xsd /c
To powinno dać ci plik yourfile.cs
, który będzie zawierał klasę C#, której możesz użyć do deserializacji otrzymywanego pliku XML-coś w stylu:
XmlSerializer serializer = new XmlSerializer(typeof(msg));
msg resultingMessage = (msg)serializer.Deserialize(new XmlTextReader("yourfile.xml"));
Powinno działać całkiem dobrze w większości przypadków.
Aktualizacja: serializer XML będzie pobierał dowolny strumień jako wejście - plik lub strumień pamięci będzie w porządku:
XmlSerializer serializer = new XmlSerializer(typeof(msg));
MemoryStream memStream = new MemoryStream(Encoding.UTF8.GetBytes(inputString));
msg resultingMessage = (msg)serializer.Deserialize(memStream);
Lub użyj Stringreadera:
XmlSerializer serializer = new XmlSerializer(typeof(msg));
StringReader rdr = new StringReader(inputString);
msg resultingMessage = (msg)serializer.Deserialize(rdr);
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-01-24 17:16:58
Masz dwie możliwości.
Metoda 1. XSD narzędzie
Załóżmy, że masz swój plik XML w tej lokalizacji
C:\path\to\xml\file.xml
- Open Developer Command Prompt
Można go znaleźć wStart Menu > Programs > Microsoft Visual Studio 2012 > Visual Studio Tools
Lub jeśli masz System Windows 8, możesz po prostu zacząć wpisywać Wiersz polecenia programisty w ekran startowy - Zmień lokalizację w katalogu plików XML wpisując
cd /D "C:\path\to\xml"
- Utwórz plik XSD z pliku xml wpisując
xsd file.xml
- Utwórz klasy C# wpisując
xsd /c file.xsd
I to wszystko! Wygenerowałeś klasy C# z pliku xml w C:\path\to\xml\file.cs
Metoda 2-wklej specjalne
Wymagany Visual Studio 2012 + z. Net Framework > = 4.5 jako cel projektu
- Skopiuj zawartość pliku XML do schowka
- Dodaj do swojego rozwiązania nowy, pusty plik klasy (Shift+Alt+C )
- otwórz ten plik i w menu kliknij
Edit > Paste special > Paste XML As Classes
I to wszystko!
Użycie
Użycie jest bardzo proste z tą klasą pomocniczą:
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());
}
}
}
Wszystko, co musisz teraz zrobić, to:
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>();
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-03-12 17:32:23
Wypróbuj tę metodę, aby przekonwertować Xml na obiekt. Jest stworzony do tego, co robisz:
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 ;
}
Wywołaj to używając tego kodu:
YourStrongTypedEntity entity = FromXml<YourStrongTypedEntity>(YourMsgString);
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-05-27 16:20:08
Po prostu uruchom Visual Studio 2013 jako Administracja ... Skopiuj zawartość pliku Xml.. Przejdź do Visual Studio 2013 > Edycja > Wklej specjalne > Wklej Xml jako klasy C# Stworzy Twoje klasy c# zgodnie z zawartością Twojego pliku Xml.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-06-12 12:21:01
Na wszelki wypadek, gdyby ktoś uznał to za przydatne:
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();
}
}
}
Można go nazwać używając:
MyCustomObject myObject = new MyCustomObject();
string xmlString = XmlConvert.SerializeObject(myObject)
myObject = XmlConvert.DeserializeObject<MyCustomObject>(xmlString);
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-07-20 12:23:28
Możesz użyć xsd.exe do tworzenia klas związanych ze schematem w. Net następnie XmlSerializer do deserializacji łańcucha: http://msdn.microsoft.com/en-us/library/system.xml.serialization.xmlserializer.deserialize.aspx
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-07-06 15:14:42
Możesz wygenerować klasę w sposób opisany powyżej, lub napisać ją ręcznie:
[XmlRoot("msg")]
public class Message
{
[XmlElement("id")]
public string Id { get; set; }
[XmlElement("action")]
public string Action { get; set; }
}
Następnie możesz użyć ExtendedXmlSerializer do serializacji i deserializacji.
Instalacja Możesz zainstalować ExtendedXmlSerializer z nuget lub uruchomić następujące polecenie:
Install-Package ExtendedXmlSerializer
Serializacja:
var serializer = new ConfigurationContainer().Create();
var obj = new Message();
var xml = serializer.Serialize(obj);
Deserializacja
var obj2 = serializer.Deserialize<Message>(xml);
Obsługa tego serializera:
- Deserializacja xml ze standardu XMLSerializer
- Klasa serializacji, struktura, Klasa uniwersalna, Typ prymitywny, lista uniwersalna i słownik, tablica, wyliczenie
- Klasa serializacji z interfejsem właściwości
- Serialization circular reference and reference Id
- Deserializacja starej wersji xml
- Szyfrowanie własności
- Custom serializer
- Obsługa XmlElementAttribute i XmlRootAttribute
- POCO-wszystkie konfiguracje (migracje, Niestandardowy serializer...) są poza klasą
ExtendedXmlSerializer support . NET 4.5 lub wyższy i . Net Core. Możesz go zintegrować z WebApi i AspCore.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-07-21 11:16:31
Jeśli masz XSD z wiadomości xml, możesz wygenerować klasy c# używając. Net xsd.narzędzie exe.
Te klasy. Net mogą być następnie użyte do wygenerowania XML.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-07-06 15:09:17
Oprócz innych odpowiedzi tutaj można oczywiście użyć klasy XmlDocument, do odczytu przypominającego DOM XML, lub XmlReader, Czytnik tylko do szybkiego przewijania do przodu, aby zrobić to "ręcznie".
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-07-06 15:18:37
Upraszczając świetną odpowiedź Damiana,
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);
}
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-08-08 13:43:53
public string Serialize<T>(T settings)
{
XmlSerializer serializer = new XmlSerializer(typeof(T));
StringWriter outStream = new StringWriter();
serializer.Serialize(outStream, settings);
return outStream.ToString();
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-10-27 22:17:43