我正在通过套接字接收XML字符串,并希望将它们转换为C#对象。
消息的形式为:
<msg>
<id>1</id>
<action>stop</action>
</msg>
我是.Net的新手,不确定执行此操作的最佳实践。我以前使用过Java的JAXB,但不确定是否存在类似的东西,或者是否会以其他方式处理。
我正在通过套接字接收XML字符串,并希望将它们转换为C#对象。
消息的形式为:
<msg>
<id>1</id>
<action>stop</action>
</msg>
我是.Net的新手,不确定执行此操作的最佳实践。我以前使用过Java的JAXB,但不确定是否存在类似的东西,或者是否会以其他方式处理。
Answers:
您需要使用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);
您有两种可能性。
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);
以防万一有人发现这有用:
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);
您可以如上所述生成类,或手动编写它们:
[XmlRoot("msg")]
public class Message
{
[XmlElement("id")]
public string Id { get; set; }
[XmlElement("action")]
public string Action { get; set; }
}
然后,您可以使用ExtendedXmlSerializer进行序列化和反序列化。
安装 您可以从nuget安装ExtendedXmlSerializer 或运行以下命令:
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集成。
您可以使用xsd.exe在.Net中创建架构绑定的类,然后使用XmlSerializer对字符串进行反序列化:http : //msdn.microsoft.com/zh-cn/library/system.xml.serialization.xmlserializer.deserialize.aspx
创建一个DTO作为CustomObject
使用以下方法使用JAXB将XML字符串转换为DTO
private static CustomObject getCustomObject(final String ruleStr) {
CustomObject customObject = null;
try {
JAXBContext jaxbContext = JAXBContext.newInstance(CustomObject.class);
final StringReader reader = new StringReader(ruleStr);
Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller();
customObject = (CustomObject) jaxbUnmarshaller.unmarshal(reader);
} catch (JAXBException e) {
LOGGER.info("getCustomObject parse error: ", e);
}
return customObject;
}
除了这里的其他答案之外,您自然可以使用XmlDocument类(用于类似XML DOM的读取)或XmlReader(仅用于快速前进的读取器)来“手动”进行操作。
使用高级xsd到c#类生成工具的另一种方法:xsd2code.com。这个工具非常方便和强大。它比Visual Studio中的xsd.exe工具具有更多的自定义设置。可以自定义Xsd2Code ++以使用列表或数组,并支持带有许多Import语句的大型模式。
注意一些功能,
我知道这个问题很旧,但是我偶然发现了这个问题,而且答案与其他所有人都不同:-)
通常的方法(如上面的评论者所述)是生成一个类并反序列化您的xml。
但是,(警告:无耻的自我推销在这里)我刚刚出版了一NuGet包,在这里,有了它您就不必。你就去:
string xml = System.IO.File.ReadAllText(@"C:\test\books.xml");
var book = Dandraka.XmlUtilities.XmlSlurper.ParseText(xml);
从字面上看就是这样,不需要其他任何东西。而且,最重要的是,如果您的xml发生更改,则对象也会自动更改。
如果您想直接下载dll,请在github页面上找到。
public string Serialize<T>(T settings)
{
XmlSerializer serializer = new XmlSerializer(typeof(T));
StringWriter outStream = new StringWriter();
serializer.Serialize(outStream, settings);
return outStream.ToString();
}