转换XML字符串对象转换XML字符串对象(Convert XML String to Object)

2019-05-10 14:46发布

我收到的XML字符串通过套接字,并希望这些转换为C#对象。

这些消息的形式是:

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

我是新来的.NET和我不知道执行此的最佳实践。 我使用JAXB的Java之前,如果有类似的东西,或者这是否会处理不同的方式不知道。

Answer 1:

您需要使用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);


Answer 2:

你有两种可能性。

方法1. XSD工具


假设你在这个位置你的XML文件C:\path\to\xml\file.xml

  1. 开放开发命令提示符
    你可以找到它在Start Menu > Programs > Microsoft Visual Studio 2012 > Visual Studio Tools或者,如果您有Windows 8可以只启动开始屏幕中键入开发商命令提示符
  2. 更改位置将XML文件目录键入cd /D "C:\path\to\xml"
  3. 通过键入创建一个从XML文件XSD文件 xsd file.xml
  4. 通过键入创建C#类 xsd /c file.xsd

就是这样! 您已经生成的XML文件的C#类在C:\path\to\xml\file.cs

方法2 - 选择性粘贴


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

  1. 您的XML文件的内容复制到剪贴板
  2. 添加到您的解决方案新的,空的类文件( 按住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>();


Answer 3:

试试这个方法将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);


Answer 4:

简单地运行您的Visual Studio 2013作为管理...复制你的XML文件的内容..去到Visual Studio 2013>编辑>选择性粘贴>粘贴XML作为C#类将根据您的XML文件的内容创建您的C#类。



Answer 5:

万一有人可能会发现这个有用:

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


Answer 6:

您可以使用XSD.EXE在.NET创建架构绑定类则XmlSerializer的反序列化字符串: http://msdn.microsoft.com/en-us/library/system.xml.serialization.xmlserializer.deserialize.aspx



Answer 7:

可以如上述那样生成的类,或者将它们手工编写:

[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);

该串行支持:

  • 从标准的XMLSerializer反序列化的XML
  • 序列化类,结构通用类,基本类型,通用的列表和字典,数组,枚举
  • 序列化类属性界面
  • 序列循环引用和参考标识
  • 老版本的XML反序列化
  • 物业加密
  • 自定义序列
  • 支持XmlElementAttribute和XmlRootAttribute
  • POCO - 所有配置(迁移,自定义序列......)是外班

ExtendedXmlSerializer支持.NET 4.5或更高版本和.NET的核心 。 你可以用的WebAPI和AspCore其集成。



Answer 8:

如果你有XML消息的XSD,然后你就可以使用。净xsd.exe工具的C#类。

然后,这个.NET类可以用来生成xml。



Answer 9:

除了其他的答案在这里,你可以自然使用的XmlDocument类,对XML DOM-喜欢读书,或XmlReader中 ,快速只进阅读器,“通过手”来做到这一点。



Answer 10:

简化达米安的伟大答案,

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


Answer 11:

另一种方式与先进的XSD到C#类生成工具:xsd2code.com。 这个工具是非常方便和强大。 它比从Visual Studio中的xsd.exe工具有更多的定制。 Xsd2Code ++可定制使用列表或数组和支持大型的模式有很多import语句。

需要注意的一些功能,

  • 从生成XSD架构或XML文件,以灵活的C#或Visual Basic代码的业务对象。
  • 支持框架2.0到4.x
  • 支持强类型集合(列表,的ObservableCollection,MyCustomCollection)。
  • 支持自动属性。
  • 生成XML读写方式(串行/解串)。
  • 支持数据绑定(WPF,Xamarin)。
  • WCF(数据成员属性)。
  • XML编码支持(UTF-8/32,ASCII,Unicode中,自定义)。
  • 骆驼情况/帕斯卡尔箱支撑。
  • 限制支撑([StringLengthAttribute =真/假],[RegularExpressionAttribute =真/假],[RangeAttribute =真/假])。
  • 支持大型复杂XSD文件。
  • DOTNET的核心和标准的支持


Answer 12:

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


文章来源: Convert XML String to Object