简体   繁体   中英

How to auto-generate code in specific .NET language based on an XSD/XML file

I need to serialize data from an XML file(s) to an object(s). This objects class is defined in the XML. There are many different XML files and I would like to auto-generate the code defining the class to save time and avoid making human mistake. Auto-generated class could be in these languages: VB, C#, JS, VJS, C++

<?xml version="1.0" encoding="utf-8" ?>
<MyFile VersionProduct="7.0" VersionCreate="7.00" VersionFile="7.00">
  <MyTable Size="20">
    <StandardTable Type="TXT">
      <MyRecord Priority="1"   Size="0" Length="350"   Weight="270"    Age="40" Ref="80"/>
      <MyRecord Priority="100" Size="0" Length="27080" Weight="27000"  Age="40" Ref="80"/>
    </StandardTable>
  </MyTable>
  <MyTable Size="28">
    <StandardTable Type="TXT">
      <MyRecord Priority="1"   Size="0" Length="350"   Weight="270"    Age="40" Ref="80"/>
      <MyRecord Priority="100" Size="0" Length="27080" Weight="27000"  Age="40" Ref="80"/>
    </StandardTable>
    <StandardTable Type="TRT">
      <MyRecord Priority="100" Size="0" Length="980"   Weight="900"    Age="40" Ref="0"/>
    </StandardTable>
  </MyTable>
</MyFile>

If you want to parse an XML file and to create an auto-generated class in .net then you should do this using the xsd.exe tool which comes as part of the Dev tools in Visual Studio.

You will need to open the Dev Command Prompt to run the tool. Open Command Prompt from inside Visual Studio

The default location for Command Prompt for VS 2013 is here , but this could change according to installation location.

In the Command Prompt run the following commands:

xsd 'yourfilename'.xml

Example: 在此处输入图像描述 This will auto-generate the XML Scheme File 'yourfilename'.xsd in the directory folder.

Next, we want to auto-generate the code using the auto-created XSD file in the language of our choice:

xsd 'yourfilename'.xsd /classes /language:vb

Example: 在此处输入图像描述 This will create an auto-generate .NET class from the XSD file which will be contained in a file called 'yourfilename'.vb.

Then you can simply add the file with your class to your project.

I choose VB but you could select: 'CS', 'VB', 'JS', 'VJS' or 'CPP'.

This is the code in the VB file which was created:

'------------------------------------------------------------------------------
' <auto-generated>
'     This code was generated by a tool.
'     Runtime Version:4.0.30319.42000
'
'     Changes to this file may cause incorrect behavior and will be lost if
'     the code is regenerated.
' </auto-generated>
'------------------------------------------------------------------------------

Option Strict Off
Option Explicit On

Imports System.Xml.Serialization

'
'This source code was auto-generated by xsd, Version=4.0.30319.33440.
'

'''<remarks/>
<System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.33440"),  _
 System.SerializableAttribute(),  _
 System.Diagnostics.DebuggerStepThroughAttribute(),  _
 System.ComponentModel.DesignerCategoryAttribute("code"),  _
 System.Xml.Serialization.XmlTypeAttribute(AnonymousType:=true),  _
 System.Xml.Serialization.XmlRootAttribute([Namespace]:="", IsNullable:=false)>  _
Partial Public Class MyFile

    Private myTableField() As MyFileMyTable

    Private versionProductField As String

    Private versionCreateField As String

    Private versionFileField As String

    '''<remarks/>
    <System.Xml.Serialization.XmlElementAttribute("MyTable", Form:=System.Xml.Schema.XmlSchemaForm.Unqualified)>  _
    Public Property MyTable() As MyFileMyTable()
        Get
            Return Me.myTableField
        End Get
        Set
            Me.myTableField = value
        End Set
    End Property

    '''<remarks/>
    <System.Xml.Serialization.XmlAttributeAttribute()>  _
    Public Property VersionProduct() As String
        Get
            Return Me.versionProductField
        End Get
        Set
            Me.versionProductField = value
        End Set
    End Property

    '''<remarks/>
    <System.Xml.Serialization.XmlAttributeAttribute()>  _
    Public Property VersionCreate() As String
        Get
            Return Me.versionCreateField
        End Get
        Set
            Me.versionCreateField = value
        End Set
    End Property

    '''<remarks/>
    <System.Xml.Serialization.XmlAttributeAttribute()>  _
    Public Property VersionFile() As String
        Get
            Return Me.versionFileField
        End Get
        Set
            Me.versionFileField = value
        End Set
    End Property
End Class

'''<remarks/>
<System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.33440"),  _
 System.SerializableAttribute(),  _
 System.Diagnostics.DebuggerStepThroughAttribute(),  _
 System.ComponentModel.DesignerCategoryAttribute("code"),  _
 System.Xml.Serialization.XmlTypeAttribute(AnonymousType:=true)>  _
Partial Public Class MyFileMyTable

    Private standardTableField() As MyFileMyTableStandardTable

    Private sizeField As String

    '''<remarks/>
    <System.Xml.Serialization.XmlElementAttribute("StandardTable", Form:=System.Xml.Schema.XmlSchemaForm.Unqualified)>  _
    Public Property StandardTable() As MyFileMyTableStandardTable()
        Get
            Return Me.standardTableField
        End Get
        Set
            Me.standardTableField = value
        End Set
    End Property

    '''<remarks/>
    <System.Xml.Serialization.XmlAttributeAttribute()>  _
    Public Property Size() As String
        Get
            Return Me.sizeField
        End Get
        Set
            Me.sizeField = value
        End Set
    End Property
End Class

'''<remarks/>
<System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.33440"),  _
 System.SerializableAttribute(),  _
 System.Diagnostics.DebuggerStepThroughAttribute(),  _
 System.ComponentModel.DesignerCategoryAttribute("code"),  _
 System.Xml.Serialization.XmlTypeAttribute(AnonymousType:=true)>  _
Partial Public Class MyFileMyTableStandardTable

    Private myRecordField() As MyFileMyTableStandardTableMyRecord

    Private typeField As String

    '''<remarks/>
    <System.Xml.Serialization.XmlElementAttribute("MyRecord", Form:=System.Xml.Schema.XmlSchemaForm.Unqualified)>  _
    Public Property MyRecord() As MyFileMyTableStandardTableMyRecord()
        Get
            Return Me.myRecordField
        End Get
        Set
            Me.myRecordField = value
        End Set
    End Property

    '''<remarks/>
    <System.Xml.Serialization.XmlAttributeAttribute()>  _
    Public Property Type() As String
        Get
            Return Me.typeField
        End Get
        Set
            Me.typeField = value
        End Set
    End Property
End Class

'''<remarks/>
<System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.33440"),  _
 System.SerializableAttribute(),  _
 System.Diagnostics.DebuggerStepThroughAttribute(),  _
 System.ComponentModel.DesignerCategoryAttribute("code"),  _
 System.Xml.Serialization.XmlTypeAttribute(AnonymousType:=true)>  _
Partial Public Class MyFileMyTableStandardTableMyRecord

    Private priorityField As String

    Private sizeField As String

    Private lengthField As String

    Private weightField As String

    Private ageField As String

    Private refField As String

    '''<remarks/>
    <System.Xml.Serialization.XmlAttributeAttribute()>  _
    Public Property Priority() As String
        Get
            Return Me.priorityField
        End Get
        Set
            Me.priorityField = value
        End Set
    End Property

    '''<remarks/>
    <System.Xml.Serialization.XmlAttributeAttribute()>  _
    Public Property Size() As String
        Get
            Return Me.sizeField
        End Get
        Set
            Me.sizeField = value
        End Set
    End Property

    '''<remarks/>
    <System.Xml.Serialization.XmlAttributeAttribute()>  _
    Public Property Length() As String
        Get
            Return Me.lengthField
        End Get
        Set
            Me.lengthField = value
        End Set
    End Property

    '''<remarks/>
    <System.Xml.Serialization.XmlAttributeAttribute()>  _
    Public Property Weight() As String
        Get
            Return Me.weightField
        End Get
        Set
            Me.weightField = value
        End Set
    End Property

    '''<remarks/>
    <System.Xml.Serialization.XmlAttributeAttribute()>  _
    Public Property Age() As String
        Get
            Return Me.ageField
        End Get
        Set
            Me.ageField = value
        End Set
    End Property

    '''<remarks/>
    <System.Xml.Serialization.XmlAttributeAttribute()>  _
    Public Property Ref() As String
        Get
            Return Me.refField
        End Get
        Set
            Me.refField = value
        End Set
    End Property
End Class

'''<remarks/>
<System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.33440"),  _
 System.SerializableAttribute(),  _
 System.Diagnostics.DebuggerStepThroughAttribute(),  _
 System.ComponentModel.DesignerCategoryAttribute("code"),  _
 System.Xml.Serialization.XmlTypeAttribute(AnonymousType:=true),  _
 System.Xml.Serialization.XmlRootAttribute([Namespace]:="", IsNullable:=false)>  _
Partial Public Class NewDataSet

    Private itemsField() As MyFile

    '''<remarks/>
    <System.Xml.Serialization.XmlElementAttribute("MyFile")>  _
    Public Property Items() As MyFile()
        Get
            Return Me.itemsField
        End Get
        Set
            Me.itemsField = value
        End Set
    End Property
End Class

I ran the xsd.exe tool again to generate C# class as well

在此处输入图像描述

and the following was the code which was auto-genearted:

    //------------------------------------------------------------------------------
    // <auto-generated>
    //     This code was generated by a tool.
    //     Runtime Version:4.0.30319.42000
    //
    //     Changes to this file may cause incorrect behavior and will be lost if
    //     the code is regenerated.
    // </auto-generated>
    //------------------------------------------------------------------------------

    using System.Xml.Serialization;

    // 
    // This source code was auto-generated by xsd, Version=4.0.30319.33440.
    // 


    /// <remarks/>

    [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.33440")]
    [System.SerializableAttribute()]
    [System.Diagnostics.DebuggerStepThroughAttribute()]
    [System.ComponentModel.DesignerCategoryAttribute("code")]
    [System.Xml.Serialization.XmlTypeAttribute(AnonymousType=true)]
    [System.Xml.Serialization.XmlRootAttribute(Namespace="", IsNullable=false)]
    public partial class MyFile {


    private MyFileMyTable[] myTableField;

    private string versionProductField;

    private string versionCreateField;

    private string versionFileField;

    /// <remarks/>
    [System.Xml.Serialization.XmlElementAttribute("MyTable", Form=System.Xml.Schema.XmlSchemaForm.Unqualified)]
    public MyFileMyTable[] MyTable {
        get {
            return this.myTableField;
        }
        set {
            this.myTableField = value;
        }
    }

    /// <remarks/>
    [System.Xml.Serialization.XmlAttributeAttribute()]
    public string VersionProduct {
        get {
            return this.versionProductField;
        }
        set {
            this.versionProductField = value;
        }
    }

    /// <remarks/>
    [System.Xml.Serialization.XmlAttributeAttribute()]
    public string VersionCreate {
        get {
            return this.versionCreateField;
        }
        set {
            this.versionCreateField = value;
        }
    }

    /// <remarks/>
    [System.Xml.Serialization.XmlAttributeAttribute()]
    public string VersionFile {
        get {
            return this.versionFileField;
        }
        set {
            this.versionFileField = value;
        }
    }


 }

    /// <remarks/>
    [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.33440")]
    [System.SerializableAttribute()]
    [System.Diagnostics.DebuggerStepThroughAttribute()]
    [System.ComponentModel.DesignerCategoryAttribute("code")]
    [System.Xml.Serialization.XmlTypeAttribute(AnonymousType=true)]
    public partial class MyFileMyTable {

    private MyFileMyTableStandardTable[] standardTableField;

    private string sizeField;

    /// <remarks/>
    [System.Xml.Serialization.XmlElementAttribute("StandardTable", Form=System.Xml.Schema.XmlSchemaForm.Unqualified)]
    public MyFileMyTableStandardTable[] StandardTable {
        get {
            return this.standardTableField;
        }
        set {
            this.standardTableField = value;
        }
    }

    /// <remarks/>
    [System.Xml.Serialization.XmlAttributeAttribute()]
    public string Size {
        get {
            return this.sizeField;
        }
        set {
            this.sizeField = value;
        }
    }
}

/// <remarks/>
[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.33440")]
[System.SerializableAttribute()]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType=true)]
public partial class MyFileMyTableStandardTable {

    private MyFileMyTableStandardTableMyRecord[] myRecordField;

    private string typeField;

    /// <remarks/>
    [System.Xml.Serialization.XmlElementAttribute("MyRecord", Form=System.Xml.Schema.XmlSchemaForm.Unqualified)]
    public MyFileMyTableStandardTableMyRecord[] MyRecord {
        get {
            return this.myRecordField;
        }
        set {
            this.myRecordField = value;
        }
    }

    /// <remarks/>
    [System.Xml.Serialization.XmlAttributeAttribute()]
    public string Type {
        get {
            return this.typeField;
        }
        set {
            this.typeField = value;
        }
    }
}

/// <remarks/>
[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.33440")]
[System.SerializableAttribute()]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType=true)]
public partial class MyFileMyTableStandardTableMyRecord {

    private string priorityField;

    private string sizeField;

    private string lengthField;

    private string weightField;

    private string ageField;

    private string refField;

    /// <remarks/>
    [System.Xml.Serialization.XmlAttributeAttribute()]
    public string Priority {
        get {
            return this.priorityField;
        }
        set {
            this.priorityField = value;
        }
    }

    /// <remarks/>
    [System.Xml.Serialization.XmlAttributeAttribute()]
    public string Size {
        get {
            return this.sizeField;
        }
        set {
            this.sizeField = value;
        }
    }

    /// <remarks/>
    [System.Xml.Serialization.XmlAttributeAttribute()]
    public string Length {
        get {
            return this.lengthField;
        }
        set {
            this.lengthField = value;
        }
    }

    /// <remarks/>
    [System.Xml.Serialization.XmlAttributeAttribute()]
    public string Weight {
        get {
            return this.weightField;
        }
        set {
            this.weightField = value;
        }
    }

    /// <remarks/>
    [System.Xml.Serialization.XmlAttributeAttribute()]
    public string Age {
        get {
            return this.ageField;
        }
        set {
            this.ageField = value;
        }
    }

    /// <remarks/>
    [System.Xml.Serialization.XmlAttributeAttribute()]
    public string Ref {
        get {
            return this.refField;
        }
        set {
            this.refField = value;
        }
    }
}

/// <remarks/>
[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.33440")]
[System.SerializableAttribute()]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType=true)]
[System.Xml.Serialization.XmlRootAttribute(Namespace="", IsNullable=false)]
public partial class NewDataSet {

    private MyFile[] itemsField;

    /// <remarks/>
    [System.Xml.Serialization.XmlElementAttribute("MyFile")]
    public MyFile[] Items {
        get {
            return this.itemsField;
        }
        set {
            this.itemsField = value;
        }
    }
}

**You can also provide the namespace as a parameter.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM