1

Visual Studioに付属のxsdツールを使用してC#クラスを生成するために使用しているXMLスキーマファイル(XSD)があります。

可能であれば、要素のタイプとして既存のタイプを指定するにはどうすればよいですか?これをやりたいと言って

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

ADODB.RecordSetインポートされたアセンブリの既存のタイプであるxsdを確認するにはどうすればよいですか?

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

using最終的に、参照およびステートメントとしてADODBを持つTableDocument名前空間に、適切なTableクラスを含む.csファイルが作成されました。

于 2012-07-23T15:39:42.513 に答える