17

I have XML file like this:

<?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>

How to quick convert it to C# classes to use access data by LINQ? Do I have to write the class manually for any XML file case? What about JSON format?

Is the XSD the only solution?

2
  • Are you really talking about classes? Or do you mean instances of a fitting class? Commented Oct 26, 2013 at 21:50
  • 1
    @MarcinJuraszek, yan.kun, I think you misunderstood the question... Commented Oct 26, 2013 at 22:09

5 Answers 5

63

You have two possibilities.

Method 1. XSD tool


Suppose that you have your XML file in this location C:\path\to\xml\file.xml

  1. Open Developer Command Prompt
    You can find it in Start Menu > Programs > Microsoft Visual Studio 2012 > Visual Studio Tools Or if you have Windows 8 can just start typing Developer Command Prompt in Start screen
  2. Change location to your XML file directory by typing cd /D "C:\path\to\xml"
  3. Create XSD file from your xml file by typing xsd file.xml
  4. Create C# classes by typing xsd /c file.xsd

And that's it! You have generated C# classes from xml file in C:\path\to\xml\file.cs

Method 2 - Paste special


Required Visual Studio 2012+

  1. Copy content of your XML file to clipboard
  2. Add to your solution new, empty class file (Shift+Alt+C)
  3. Open that file and in menu click Edit > Paste special > Paste XML As Classes
    enter image description here

And that's it!

Usage


Usage is very simple with this helper class:

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

All you have to do now, is:

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

Here you have some Online XML <--> JSON Converters: Click

Sign up to request clarification or add additional context in comments.

4 Comments

+1 for "Paste XML as Classes", I didn't know this option. It can definitely come in handy...
When selecting the Edit > Paste Special menu while in the code of a class file, make sure that the Visual Studio project that your class file is under has its 'Target Framework' set to: .NET Framework 3.5+ for 'Paste JSON as Classes' .NET Framework 4.5+ for 'Paste XML as Classes' Otherwise these options do not appear. The 'Target Framework' setting is under the Project Properties > Application.
nice feature. Thanks!
this paste "XML as classes" option is just great,
2

You can follow this simple step

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

Comments

0

Use the XML Schema Definition Tool xsd.exe found in your framework tools to convert your schema into a serializable class or dataset.

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

And in example, whereas the C# class will be generated in the same directory as the xsd tool:

xsd /c YourFile.xsd

Comments

0

Use the super simple way using 'Paste XML As Classes' functionality in Visual studio menu.

1.copy the xml source in the clipboard, something like CTRL+A and CTRL+C

2.Go to 'Edit' Menu -> Paste Special -> Paste XML As Classes, to paste the generated classes based on the source xml"

Ref: More steps in detail at this link

Comments

0

Here is one another easy way to parse xml file using Cinchoo ETL, an open source library

Define POCO class as below

public class Book
{
    [ChoXPath("@id")]
    public int Id { get; set; }
    [ChoXPath("@date")]
    public DateTime Date { get; set; }
    [ChoXPath("author")]
    public string Author { get; set; }
    [ChoXPath("title")]
    public string Title { get; set; }
    [ChoXPath("price")]
    public double Price { get; set; }
    [ChoXPath("description")]
    public string Description { get; set; }
}

Use it to the parser as below

using (var r = new ChoXmlReader<Book>("*** Xml file path ***")
       .WithXPath("//catalog/book", true)
       )
{
    foreach (var rec in r)
        rec.Print();
}

Sample fiddle: https://dotnetfiddle.net/3UI82F

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.