如何将XML/JSON文件转换为C#类?

14 .net c# xml json

我有这样的XML文件:

<?xml version="1.0"?>
<catalog>
    <book id="1" date="2012-02-01">
        <title>XML Developer's Guide</title>
        <price>44.95</price>
        <description>
            An in-depth look at creating applications
            with XML.
        </description>
    </book>
    <book id="2" date="2013-10-16">
        <author>Mark Colsberg</author>
        <title>Dolor sit amet</title>
        <price>5.95</price>
        <description>Lorem ipsum</description>
    </book>
</catalog>
Run Code Online (Sandbox Code Playgroud)

如何快速将其转换为C#类以使用LINQ的访问数据?我是否必须手动为任何XML文件案例编写类?JSON格式怎么样?

XSD是唯一的解决方案吗?

Dam*_*iel 58

你有两种可能性.

方法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+

  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());
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

你现在要做的就是:

    public class JSONRoot
    {
        public catalog catalog { get; set; }
    }
    // ...

    string xml = File.ReadAllText(@"C:\path\to\xml\file.xml");
    var catalog1 = xml.ParseXML<catalog>();

    string json = File.ReadAllText(@"C:\path\to\json\file.json");
    var catalog2 = json.ParseJSON<JSONRoot>();
Run Code Online (Sandbox Code Playgroud)

这里有一些在线XML <--> JSON转换器:点击

  • "将XML粘贴为类"的+1,我不知道这个选项.它绝对可以派上用场...... (12认同)
  • 在类文件的代码中选择"编辑">"选择性粘贴"菜单时,请确保您的类文件所在的Visual Studio项目的"目标框架"设置为:.NET Framework 3.5+ for"将JSON粘贴为类" '.NET Framework 4.5+用于'将XML粘贴为类'否则这些选项不会出现."目标框架"设置位于"项目属性">"应用程序"下. (5认同)