[英]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.