Search code examples
c#xmlxsdxsd.exelinq-to-xsd

How to create a XSD schema from a class?


I'm having a hard time with the XSD files.

I'm trying to create an XSD file from a class:

public enum Levels { Easy, Medium, Hard }
public sealed class Configuration
{
    public string Name { get;set; }
    public Levels Level { get; set; }
    public ConfigurationSpec { get;set;}
}

public abstract class ConfigurationSpec { }
public class ConfigurationSpec1
{
    // ...
}
public class ConfigurationSpec2
{
    // ...
}

Please note that I have an abstract class inside of Configuration. With that feature, is it possible to create the XSD and if it's possible how?

The idea is to pass the class Configuration to the XSD.


Solution

  • You can use XSD.exe (Available from your Visual Studio Installation.)

    public sealed class Configuration
    {
     public string Name { get; set; }
     public Levels Level { get; set; }
     public ConfigurationSpec Spec { get; set; }
    }
     public abstract class ConfigurationSpec { }
     public class ConfigurationSpec1    {   }
    public class ConfigurationSpec2 {   }
    

    results in

    <?xml version="1.0" encoding="utf-8"?>
    <xs:schema elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
      <xs:element name="Levels" type="Levels" />
      <xs:simpleType name="Levels">
        <xs:restriction base="xs:string">
          <xs:enumeration value="Easy" />
          <xs:enumeration value="Medium" />
          <xs:enumeration value="Hard" />
        </xs:restriction>
      </xs:simpleType>
      <xs:element name="Configuration" nillable="true" type="Configuration" />
      <xs:complexType name="Configuration">
        <xs:sequence>
          <xs:element minOccurs="0" maxOccurs="1" name="Name" type="xs:string" />
          <xs:element minOccurs="1" maxOccurs="1" name="Level" type="Levels" />
          <xs:element minOccurs="0" maxOccurs="1" name="Spec" type="ConfigurationSpec" />
        </xs:sequence>
      </xs:complexType>
      <xs:complexType name="ConfigurationSpec" abstract="true" />
      <xs:element name="ConfigurationSpec" nillable="true" type="ConfigurationSpec" />
      <xs:element name="ConfigurationSpec1" nillable="true" type="ConfigurationSpec1" />
      <xs:complexType name="ConfigurationSpec1" />
      <xs:element name="ConfigurationSpec2" nillable="true" type="ConfigurationSpec2" />
      <xs:complexType name="ConfigurationSpec2" />
    </xs:schema>
    

    All you have to do is compiling your assembly and run XSD.exe with the path to your assembly as argument. XSD.exe /? has a list of all arguments as well.

    Example: XSD.exe C:\Dev\Project1\Bin\Debug\library.dll