我收到的XML字符串通过套接字,并希望这些转换为C#对象。
这些消息的形式是:
<msg>
<id>1</id>
<action>stop</action>
</msg>
我是新来的.NET和我不知道执行此的最佳实践。 我使用JAXB的Java之前,如果有类似的东西,或者这是否会处理不同的方式不知道。
我收到的XML字符串通过套接字,并希望这些转换为C#对象。
这些消息的形式是:
<msg>
<id>1</id>
<action>stop</action>
</msg>
我是新来的.NET和我不知道执行此的最佳实践。 我使用JAXB的Java之前,如果有类似的东西,或者这是否会处理不同的方式不知道。
您需要使用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
其中将包含您可以使用反序列化你得到的XML文件的C#类-是这样的:
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#类在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>编辑>选择性粘贴>粘贴XML作为C#类将根据您的XML文件的内容创建您的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();
}
}
}
您可以通过调用它:
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);
该串行支持:
ExtendedXmlSerializer支持.NET 4.5或更高版本和.NET的核心 。 你可以用的WebAPI和AspCore其集成。
如果你有XML消息的XSD,然后你就可以使用。净xsd.exe工具的C#类。
然后,这个.NET类可以用来生成xml。
除了其他的答案在这里,你可以自然使用的XmlDocument类,对XML DOM-喜欢读书,或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);
}
}
另一种方式与先进的XSD到C#类生成工具:xsd2code.com。 这个工具是非常方便和强大。 它比从Visual Studio中的xsd.exe工具有更多的定制。 Xsd2Code ++可定制使用列表或数组和支持大型的模式有很多import语句。
需要注意的一些功能,
public string Serialize<T>(T settings)
{
XmlSerializer serializer = new XmlSerializer(typeof(T));
StringWriter outStream = new StringWriter();
serializer.Serialize(outStream, settings);
return outStream.ToString();
}