1

我有一个 XML Schema 文件 (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是导入程序集中的现有类型?

4

2 回答 2

0

也许这会有所帮助?

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

/t[ype]:typename

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

于 2012-07-23T12:36:34.967 回答
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.Recordsetxsd: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>

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

于 2012-07-23T15:39:42.513 回答