如何基于 XSD/XML 文件自动生成特定 .NET 语言的代码

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

我需要将 XML 文件中的数据序列化为对象。此对象 class 是在 XML 中定义的。有许多不同的 XML 文件,我想自动生成定义 class 的代码以节省时间并避免人为错误。自动生成的 class 可能是这些语言:VB、C#、JS、VJS、C++

我怎样才能将这个 XML 代码自动生成为特定语言?

XML 文件的示例如下:

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

***有很多 XML 文件,我想从中自动生成代码,这个 XML 只是用来提供一个简单的例子。

如果你想解析一个 XML 文件并在 .net 中创建一个 auto-generated class 那么你应该使用 xsd.exe 工具来完成Visual Studio 中开发工具的一部分。

您需要打开 Dev 命令提示符才能 运行 该工具。 Open Command Prompt from inside Visual Studio

VS 2013 命令提示符的默认位置是 here,但这可能会根据安装位置而改变。

在命令提示符 运行 中执行以下命令:

xsd 'yourfilename'.xml

示例: 这将auto-generate目录文件夹中的XML方案文件'yourfilename'.xsd。

接下来,我们要 auto-generate 使用我们选择的语言的 auto-created XSD 文件的代码:

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

示例: 这将从 XSD 文件创建一个 auto-generate .NET class,该文件将包含在名为 'yourfilename'.vb.[ 的文件中=48=]

然后您只需将包含 class 的文件添加到您的项目中即可。

我选择 VB,但你可以 select:'CS'、'VB'、'JS'、'VJS' 或 'CPP' .

这是创建的 VB 文件中的代码:

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

我运行再次使用xsd.exe工具生成C#class

下面是 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;
        }
    }
}

**您还可以提供命名空间作为参数。