Я получаю XML-строки над сокетом и хотел бы преобразовать их в объекты С#.
Сообщения имеют форму:
<msg>
<id>1</id>
<action>stop</action>
</msg>
Я новичок в .Net, и я не уверен в лучшей практике для этого. Раньше я использовал JAXB для Java и не был уверен, есть ли что-то подобное, или если это будет обрабатываться по-другому.
Вам нужно использовать инструмент xsd.exe
, который устанавливается с SDK Windows в каталог, похожий на:
C:\Program Files\Microsoft SDKs\Windows\v6.0A\bin
И на 64-битных компьютерах:
C:\Program Files (x86)\Microsoft SDKs\Windows\v6.0A\bin
И на компьютерах с Windows 10:
C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\bin
В первом запуске вы используете xsd.exe
, и вы конвертируете образец XML в файл XSD (файл XML-схемы):
xsd yourfile.xml
Это дает вам yourfile.xsd
, который на втором этапе можно снова преобразовать с помощью xsd.exe
в класс С#:
xsd yourfile.xsd /c
Это должно дать вам файл yourfile.cs
, который будет содержать класс С#, который вы можете использовать для десериализации XML файла, который вы получаете, например:
XmlSerializer serializer = new XmlSerializer(typeof(msg));
msg resultingMessage = (msg)serializer.Deserialize(new XmlTextReader("yourfile.xml"));
В большинстве случаев это работает очень хорошо.
Обновление: XML-сериализатор примет любой поток в качестве своего ввода - либо файл, либо поток памяти будут в порядке:
XmlSerializer serializer = new XmlSerializer(typeof(msg));
MemoryStream memStream = new MemoryStream(Encoding.UTF8.GetBytes(inputString));
msg resultingMessage = (msg)serializer.Deserialize(memStream);
или используйте StringReader:
XmlSerializer serializer = new XmlSerializer(typeof(msg));
StringReader rdr = new StringReader(inputString);
msg resultingMessage = (msg)serializer.Deserialize(rdr);
У вас есть две возможности.
C:\path\to\xml\file.xml
Start Menu > Programs > Microsoft Visual Studio 2012 > Visual Studio Tools
Или, если у вас есть Windows 8, можно просто начать набирать Командная строка разработчика на экране запускаcd /D "C:\path\to\xml"
xsd file.xml
xsd /c file.xsd
И это! Вы создали классы С# из XML файла в C:\path\to\xml\file.cs
Edit > Paste special > Paste XML As Classes
И это!
Использование этого класса-помощника очень просто:
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());
}
}
}
Все, что вам нужно сделать сейчас, это:
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>();
Попробуйте этот метод для преобразования Xml в объект. Это сделано именно для того, что вы делаете:
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 ;
}
Назовите его с помощью этого кода:
YourStrongTypedEntity entity = FromXml<YourStrongTypedEntity>(YourMsgString);
Просто запустите Visual Studio 2013 в качестве администратора... Скопируйте содержимое вашего файла Xml. Перейти к Visual Studio 2013 > Edit > Paste Special > Вставить Xml как классы С# Он создаст ваши классы С# в соответствии с вашим содержимым файла Xml.
На всякий случай кто-то может найти это полезным:
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();
}
}
}
Вы можете вызвать его, используя:
MyCustomObject myObject = new MyCustomObject();
string xmlString = XmlConvert.SerializeObject(myObject)
myObject = XmlConvert.DeserializeObject<MyCustomObject>(xmlString);
Вы можете использовать xsd.exe для создания связанных классов схемы в .Net, затем XmlSerializer для десериализации строки: http://msdn.microsoft.com/en-us/library/system.xml.serialization.xmlserializer.deserialize.aspx
Вы можете сгенерировать класс, как описано выше, или написать их вручную:
[XmlRoot("msg")]
public class Message
{
[XmlElement("id")]
public string Id { get; set; }
[XmlElement("action")]
public string Action { get; set; }
}
Затем вы можете использовать ExtendedXmlSerializer для сериализации и десериализации.
Instalation Вы можете установить ExtendedXmlSerializer из nuget или выполнить следующую команду:
Install-Package ExtendedXmlSerializer
Сериализация:
var serializer = new ConfigurationContainer().Create();
var obj = new Message();
var xml = serializer.Serialize(obj);
Десериализация
var obj2 = serializer.Deserialize<Message>(xml);
Эта поддержка сериализатора:
ExtendedXmlSerializer поддерживает .NET 4.5 или выше и .NET Core. Вы можете интегрировать его с WebApi и AspCore.
Упрощение ответа Дамиана,
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);
}
}
В дополнение к другим ответам здесь вы можете естественно использовать класс XmlDocument для чтения в формате XML DOM или XmlReader, читатель с быстрой перемоткой вперед, чтобы сделать это "вручную".
Если у вас есть xsd сообщения xml, вы можете сгенерировать классы С# с помощью инструмента .Net xsd.exe.
Затем эти .Net-классы можно использовать для генерации xml.
public string Serialize<T>(T settings)
{
XmlSerializer serializer = new XmlSerializer(typeof(T));
StringWriter outStream = new StringWriter();
serializer.Serialize(outStream, settings);
return outStream.ToString();
}