Преобразование строки XML в объект
Я получаю строки XML через сокет и хотел бы преобразовать их в объекты C#.
сообщения вида:
<msg>
<id>1</id>
<action>stop</action>
</msg>
Я новичок в .Net, и не уверен, что лучшая практика для выполнения этого. Я использовал JAXB для Java раньше и не был уверен, есть ли что-то подобное, или это будет обработано по-другому.
11 ответов
вам нужно использовать xsd.exe
инструмент, который устанавливается с помощью Windows SDK в каталог, похожий на:
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
в C# класс:
xsd yourfile.xsd /c
это должно дать вам файл yourfile.cs
который будет содержать класс C#, который вы можете использовать для десериализации 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);
у вас есть две возможности.
Способ 1. xsd-схемы инструмент
Предположим, что у вас есть XML-файл в этом месте
C:\path\to\xml\file.xml
- открыть Командная Строка Разработчика
Вы можете найти его вStart Menu > Programs > Microsoft Visual Studio 2012 > Visual Studio Tools
Или если у вас Windows 8 можно просто начать печатать Командная Строка Разработчика на пуск экрана - измените местоположение на каталог XML-файлов, введя
cd /D "C:\path\to\xml"
- создать XSD файл из xml-файла, введя
xsd file.xml
- создать C# классы введя
xsd /c file.xsd
и это все! Вы создали классы C# из xml-файла в C:\path\to\xml\file.cs
Метод 2-Специальная вставка
Требуется Visual Studio 2012+ с .Net Framework >= 4.5 в качестве цели проекта
- скопируйте содержимое XML-файла в буфер обмена
- добавить в решение новый пустой файл класса ( Shift+Alt+C)
- открыть этот файл и в меню выберите
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 > правка > Специальная вставка > вставить Xml как классы C# Он создаст ваши классы C# в соответствии с содержимым вашего 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 для сериализации и десериализации.
установка Вы можете установить 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);
этот поддержка сериализатора:
- десериализация xml из стандартного XMLSerializer
- класс сериализации, структура, общий класс, примитивный тип, общий список и словарь, массив, перечисление
- класс сериализации с интерфейсом свойств
- циклическая ссылка сериализации и идентификатор ссылки
- десериализация старой версии xml
- шифрование собственность
- таможня сериализатор
- поддержка XmlElementAttribute и XmlRootAttribute
- POCO - все конфигурации (миграции, пользовательский сериализатор...) находятся вне класса
поддержка ExtendedXmlSerializer .NET 4.5 или выше и .NET Core. Вы можете интегрировать его с WebApi и AspCore.
Если у вас есть xsd сообщения xml, то вы можете создавать классы c# с помощью .Net xsd.инструмент exe.
затем эти классы .Net можно использовать для создания xml.
В дополнение к другим ответы здесь вы можете естественно использовать XmlDocument класс, для чтения XML DOM-like или XmlReader, быстрая перемотка вперед-только для чтения, чтобы сделать это "вручную".
упрощая великий ответ Дамиана,
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);
}
}
public string Serialize<T>(T settings)
{
XmlSerializer serializer = new XmlSerializer(typeof(T));
StringWriter outStream = new StringWriter();
serializer.Serialize(outStream, settings);
return outStream.ToString();
}