我通过套接字接收XML字符串,并希望将这些转换为c#对象。
这些消息的形式是:
<msg>
<id>1</id>
<action>stop</action>
</msg>
如何做到这一点呢?
我通过套接字接收XML字符串,并希望将这些转换为c#对象。
这些消息的形式是:
<msg>
<id>1</id>
<action>stop</action>
</msg>
如何做到这一点呢?
当前回答
简单地运行你的Visual Studio 2013管理… 复制Xml文件的内容。 进入Visual Studio 2013 >编辑>粘贴特殊>将Xml粘贴为c#类 它将根据Xml文件内容创建c#类。
其他回答
你需要使用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
这会给你你的文件。在第二步中,您可以再次使用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);
我知道这个问题很老了,但我无意中发现了它,我有一个和其他人不同的答案:-)
通常的方法(如上面的评论者所述)是生成一个类并反序列化xml。
但是(警告:这里是无耻的自我推销)我刚刚发布了一个小包,在这里,你不必使用它。你只要说:
string xml = System.IO.File.ReadAllText(@"C:\test\books.xml");
var book = Dandraka.XmlUtilities.XmlSlurper.ParseText(xml);
这就是它的字面意思,没有其他需要。最重要的是,如果xml发生变化,对象也会自动发生变化。
如果您喜欢直接下载dll, github页面在这里。
如果您有xml消息的xsd,那么您可以使用. net xsd.exe工具生成c#类。
然后可以使用这个. net类来生成xml。
除了这里的其他答案之外,您还可以自然地使用XmlDocument类(用于类似XML dom的读取)或XmlReader(仅向前的快速读取器)来“手动”执行此操作。
有两种可能。
方法1。XSD的工具
假设XML文件位于C:\path\to\ XML \file. XML
打开开发人员命令提示符 你可以在开始菜单>程序> Microsoft Visual Studio 2012 > Visual Studio工具中找到它 或者如果你有Windows 8,可以在开始屏幕中输入开发人员命令提示符 输入cd /D "C:\path\to\ XML " 通过输入XSD file.xml从xml文件创建XSD文件 通过输入xsd / C file.xsd创建c#类
就是这样!您已经从C:\path\到\xml\file.cs中的xml文件生成了c#类
方法2 -粘贴特殊
要求Visual Studio 2012+与。net框架>= 4.5作为项目目标和“Windows通信基础”单独组件安装
将XML文件的内容复制到剪贴板 向您的解决方案添加新的空类文件(Shift+Alt+C) 打开该文件,在菜单中单击编辑>粘贴特殊>粘贴XML作为类
就是这样!
使用
这个helper类的用法非常简单:
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>();