我有一个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
是导入程序集中的现有类型?
答案 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
语句。