繁体   English   中英

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

[英]Using xsd.exe to generate C# classes, how to specify an existing type?

我有一个XML架构文件(XSD),我正在使用它使用Visual Studio随附的xsd工具生成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是导入程序集中的现有类型?

也许这会有所帮助?

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

/t[ype]:typename

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

我不确定这是否是最好的方法,但是我通过实现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的参数文件( /p:parameters.xml开关)中指定程序集:

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

我最终得到了一个具有适当Table类的.cs文件,位于具有ADODB作为引用和using语句的TableDocument命名空间中。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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