将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
- 打开开发人员命令提示符
您可以在Start Menu > Programs > Microsoft Visual Studio 2012 > Visual Studio Tools
find它或者如果您有Windows 8,只需在开始屏幕中inputDeveloper Command Prompt - 通过input
cd /D "C:\path\to\xml"
位置更改为XML文件目录 - 通过键入
xsd file.xml
从xml文件创buildXSD文件 - 通过键入
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作为项目的目标
- 将XML文件的内容复制到剪贴板
- 添加到您的解决scheme新的空的类文件( 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作为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(); }