Как преобразовать файл XML/JSON в класс С#?

У меня есть XML файл:

<?xml version="1.0"?>
<catalog>
    <book id="1" date="2012-02-01">
        <title>XML Developer 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>

Как быстро преобразовать его в классы С# для использования данных доступа LINQ? Должен ли я писать класс вручную для любого файла XML файла? Как насчет формата JSON?

Является ли XSD единственным решением?

Ответы

Ответ 1

У вас есть две возможности.

Метод 1. Инструмент XSD


Предположим, что у вас есть ваш XML файл в этом месте C:\path\to\xml\file.xml
  • Откройте Командная строка разработчика
    Вы можете найти его в Start Menu > Programs > Microsoft Visual Studio 2012 > Visual Studio Tools Или, если у вас есть Windows 8, можно просто начать набирать Командная строка разработчика на экране запуска
  • Измените местоположение в каталоге файла XML, набрав cd /D "C:\path\to\xml"
  • Создайте XSD файл из вашего xml файла, набрав xsd file.xml
  • Создайте классы С#, набрав xsd /c file.xsd

И это! Вы создали классы С# из XML файла в C:\path\to\xml\file.cs

Способ 2 - Вставить специальный


Требуемая Visual Studio 2012 +
  • Скопировать содержимое вашего XML файла в буфер обмена
  • Добавьте к вашему решению новый пустой файл класса (Shift + Alt + C)
  • Откройте этот файл и в меню нажмите Edit > Paste special > Paste XML As Classes
    enter image description here

И это!

Использование


Использование этого класса-помощника очень просто:

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(@"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>();

Здесь есть несколько сетевых преобразователей XML <--> JSON: Нажмите

Ответ 2

Вы можете выполнить этот простой шаг

1.Please Add using System.Xml as a reference;
2.Make a class named book in this way



     public class book
            {
                public Nullable<System.DateTime> date{ get; set; }
                public decimal price { get; set; }
                public string title { get; set; }
                public string description { get; set; }
        }

    try
                {
                    XmlDocument xmlDoc = new XmlDocument();
                    xmlDoc.Load("Write down full path");
                    XmlNodeList dataNodes = xmlDoc.SelectNodes("/catalog");

                    foreach (XmlNode node in dataNodes)
                    {
                        book objbook = new book();
                     objbook.date=Convert.ToDateTime(node.Attributes["date"].Value);
                       objbook.title=node.SelectSingleNode("title").InnerText;
                   objbook.description=node.SelectSingleNode("description").InnerText;
objbook.price=Convert.ToDecimal(node.SelectSingleNode("price").InnerText);

                    }

                }
catch(Exception ex)
{
throw ex;
}

Ответ 3

С помощью Инструментария определения схемы XML xsd.exe найдено в ваших инструментах framework, чтобы преобразовать вашу схему в сериализуемый класс или набор данных.

xsd file.xsd {/classes | /dataset} [/element:element]
         [/language:language] [/namespace:namespace]
         [/outputdir:directory] [URI:uri]

И в примере, в то время как класс С# будет сгенерирован в том же каталоге, что и инструмент xsd:

xsd /c YourFile.xsd

Ответ 4

Используйте простой способ, используя Вставить XML как классы " в меню Visual Studio.

1. скопируйте источник xml в буфер обмена, что-то вроде CTRL + A и CTRL + C

2. Перейдите в меню "Редактировать" → Специальная вставка → Вставьте XML как классы, чтобы вставить сгенерированные классы на основе исходного xml "

Ссылка: дополнительные шаги по этой ссылке