如何从XSD / XML自动生成特定.NET语言的类代码?

时间:2017-02-16 12:49:18

标签: c# c++ .net xml xsd.exe

存在一个名为XSD的标准(XML Schema Definition),它将类定义生成为XML格式。生成的类可以使用以下语言: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只是用来提供一个简单的例子。

1 个答案:

答案 0 :(得分:1)

如果要解析XML文件并在.net中创建自动生成的类,则应使用xsd.exe工具执行此操作,该工具是Visual Studio中Dev工具的一部分。

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

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

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

  

xsd'yourfilename'.xml

实施例: enter image description here 这将在目录文件夹中自动生成XML Scheme File'yourfilename'.xsd。

接下来,我们希望使用我们选择的语言使用自动创建的XSD文件自动生成代码:

  

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

实施例: enter image description here 这将从XSD文件创建一个自动生成.NET类,该类将包含在名为“yourfilename”.vb的文件中。

然后,您只需将您的课程文件添加到项目中即可。

我选择VB但您可以选择:'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#类

enter image description here

以下是自动生成的代码:

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

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