使用xsd.exe生成C#类,如何指定现有类型?

时间:2012-07-23 09:53:24

标签: c# xsd

我有一个XML Schema文件(XSD),我用它来使用Visual Studio提供的xsd tool生成C#类。

如果可能,我如何指定现有类型作为元素的类型?说我想这样做

<xs:element name="Table">
    <xs:complexType>
        <xs:all>
            <!-- ...snip... -->
            <xs:element name="CellValues" type="ADODB.RecordSet"/>
        </xs:all>
    </xs:complexType>
</xs:element>

如何告诉xsd ADODB.RecordSet是导入程序集中的现有类型?

2 个答案:

答案 0 :(得分:0)

也许这会有所帮助?

(来自http://msdn.microsoft.com/en-us/library/x6c1kb0s(v=vs.71).aspx

/t[ype]:typename
  

指定要为其创建架构的类型的名称。你可以指定   多个类型参数。如果typename没有指定命名空间,   Xsd.exe匹配具有指定类型的程序集中的所有类型。如果   typename指定命名空间,仅匹配该类型。如果是typename   以星号字符(*)结尾,该工具匹配所有类型   从*之前的字符串开始。如果省略/ type选项,   Xsd.exe为程序集中的所有类型生成模式。

答案 1 :(得分:0)

我不确定这是否是最好的方式,但我设法通过实施SchemaImporterExtension来做某事:

namespace SchemaImport
{
    public class ADODBSchemaImporterExtension : SchemaImporterExtension
    {

        public override CodeExpression ImportDefaultValue(string value, string type)
        {
            return new CodeTypeReferenceExpression(type);
        }

        public override string ImportSchemaType(XmlSchemaType type,
            XmlSchemaObject context, XmlSchemas schemas, XmlSchemaImporter importer,
            CodeCompileUnit compileUnit, CodeNamespace codeNamespace,
            CodeGenerationOptions options, CodeDomProvider codeGenerator)
        {
        return null;
        }

        public override string ImportSchemaType(string name, 
            string ns, XmlSchemaObject context, XmlSchemas schemas, XmlSchemaImporter importer, 
            CodeCompileUnit compileUnit, CodeNamespace mainNamespace, 
            CodeGenerationOptions options, CodeDomProvider codeProvider)
        {
            if (name.StartsWith("ADODB."))
            {
                compileUnit.ReferencedAssemblies.Add("adodb.dll");
                mainNamespace.Imports.Add(new CodeNamespaceImport("ADODB"));
                return name.Substring(name.IndexOf(".") + 1);
            }
            return null;
        }
    }
}

ADODB.Recordset定义为xsd:complexType

<xs:element name="Table">
    <xs:complexType>
        <xs:all>
            <!-- ...snip... -->
            <xs:element name="CellValues" type="ADODB.RecordSet"/>
        </xs:all>
    </xs:complexType>
</xs:element>
<xs:complexType name="ADODB.Recordset"/>

然后我必须将此课程添加到machine.config

<system.xml.serialization>
    <schemaImporterExtensions> 
        <add type="SchemaImport.ADODBSchemaImporterExtension, SchemaImport, Version=1.0.0.0, Culture=neutral, PublicKeyToken=cd583032ee337c41" /> 
    </schemaImporterExtensions>
</system.xml.serialization>

并在参数文件(/p:parameters.xml开关)中指定程序集到xsd.exe:

<?xml version="1.0" encoding="UTF-8"?>
<xsd xmlns='http://microsoft.com/dotnet/tools/xsd/'>
    <generateClasses language='c#' namespace='TableDocument'>
        <schemaImporterExtensions>
            <type>SchemaImport.ADODBSchemaImporterExtension, SchemaImport, Version=1.0.0.0, Culture=neutral, PublicKeyToken=cd583032ee337c41</type>
        </schemaImporterExtensions>
    </generateClasses>
</xsd>

我最后在TableDocument命名空间中使用相应的Table类创建了一个.cs文件,该命名空间将ADODB作为引用和using语句。