将XMLstring转换为对象

我正在通过套接字接收XMLstring,并希望将它们转换为C#对象。

消息的forms是:

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

我是.Net新手,不确定是否执行此操作的最佳做​​法。 我之前使用JAXB for Java,并不确定是否有类似的东西,或者如果以不同的方式处理。

您需要使用与Windows SDK一起安装的xsd.exe工具进入与以下类似的目录:

 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序列化程序将采取任何stream作为其input – 文件或内存stream将罚款:

 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

  1. 打开开发人员命令提示符
    您可以在Start Menu > Programs > Microsoft Visual Studio 2012 > Visual Studio Toolsfind它或者如果您有Windows 8,只需在开始屏幕中inputDeveloper Command Prompt
  2. 通过inputcd /D "C:\path\to\xml"位置更改为XML文件目录
  3. 通过键入xsd file.xml从xml文件创buildXSD文件
  4. 通过键入xsd /c file.xsd创buildC#类

而就是这样! 您已经从C:\path\to\xml\file.cs xml文件生成了C#类C:\path\to\xml\file.cs

方法2 – 特殊粘贴


所需的Visual Studio 2012+与.Net框架> = 4.5作为项目的目标

  1. 将XML文件的内容复制到剪贴板
  2. 添加到您的解决scheme新的空的类文件( Shift + Alt + C
  3. 打开该文件,然后在菜单中单击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作为pipe理…复制你的Xml文件的内容..转到Visual Studio 2013>编辑>select性粘贴>将Xml粘贴为C#类它将根据您的Xml文件内容创build您的C#类。

以防万一任何人可能会觉得这有用:

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

您可以使用xsd.exe在.Net中创build模式绑定类,然后使用XmlSerializer来反序列化string: http : //msdn.microsoft.com/zh-cn/library/system.xml.serialization.xmlserializer.deserialize.aspx

如果您有xml消息的xsd,那么您可以使用.Net xsd.exe工具生成c#类。

这个.Net类可以用来生成xml。

除了这里的其他答案之外,您自然可以使用XmlDocument类(用于XML DOM类阅读)或XmlReader (快速前向阅读器)来“手动”。

你可以像上面描述的那样生成类,或者手动编写它们:

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

然后你可以使用ExtendedXmlSerializer来序列化和反序列化。

Instalation您可以从nuget安装ExtendedXmlSerializer或运行以下命令:

 Install-Package ExtendedXmlSerializer 

连载:

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

反序列化

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

这个串行器支持:

  • 从标准的XMLSerializer反序列化XML
  • 序列化类,结构体,generics类,基元types,generics列表和字典,数组,枚举
  • 具有属性接口的序列化类
  • 序列化循环引用和引用Id
  • 旧版本的xml的反序列化
  • 属性encryption
  • 自定义序列化器
  • 支持XmlElementAttribute和XmlRootAttribute
  • POCO – 所有configuration(迁移,自定义序列化…)都在课程之外

ExtendedXmlSerializer支持.NET 4.5或更高版本和.NET Core 。 您可以将其与WebApi和AspCore集成。

 public string Serialize<T>(T settings) { XmlSerializer serializer = new XmlSerializer(typeof(T)); StringWriter outStream = new StringWriter(); serializer.Serialize(outStream, settings); return outStream.ToString(); }