包含在不同程序集中定义的 xsd 架构复杂类型中
本文关键字:xsd 复杂 类型 定义 程序 集中 程序集 包含 | 更新日期: 2023-09-27 18:30:49
>我需要在我的 xsd 架构中使用在不同程序集中定义的复杂类型。我的两个 .xsd 架构都定义为嵌入式资源,并且我尝试链接必须在程序集中导入的工作表,谁需要它但没有结果。
基本上,当我需要验证我的一个 xml 页面时,我调用此函数,但它无法级联操作中类型的 xml 架构集。
public static XmlSchema GetDocumentSchema(this Document doc)
{
var actualType = doc.GetType();
var stream = actualType.Assembly.GetManifestResourceStream(actualType.FullName);
if (stream == null)
{
throw new FileNotFoundException("Unable to load the embedded file [" + actualType.FullName + "]");
}
var documentSchema = XmlSchema.Read(stream, null);
foreach (XmlSchemaExternal xmlInclude in documentSchema.Includes)
{
var includeStream = xmlInclude.SchemaLocation != "Operations.xsd"
? actualType.Assembly.GetManifestResourceStream(xmlInclude.Id)
: typeof (Operations).Assembly.GetManifestResourceStream(xmlInclude.Id);
if (includeStream == null)
{
throw new FileNotFoundException("Unable to load the embedded include file [" + xmlInclude.Id + "]");
}
xmlInclude.Schema = XmlSchema.Read(includeStream, null);
}
return documentSchema;
}
这是主架构:
<?xml version="1.0" encoding="utf-8"?>
<xs:schema id="ExampleSheet"
attributeFormDefault="unqualified"
elementFormDefault="qualified"
xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:include id="Operations" schemaLocation="Operations.xsd"/>
<xs:element name="ExampleSheet">
<xs:complexType>
<xs:sequence>
<xs:element name="Operations" type="Operations"/>
</xs:sequence>
<xs:attribute name="version" type="xs:string" use="required"/>
</xs:complexType>
</xs:element>
</xs:schema>
这是操作的架构:
<xs:schema id="Operations"
elementFormDefault="qualified"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
>
<xs:element name="Operations" type="Operations"/>
<xs:complexType name="Operations">
<xs:choice minOccurs="1" maxOccurs="unbounded">
<xs:element name="Insert" type="Insert"/>
<xs:element name="InsertUpdate" type="InsertUpdate"/>
<xs:element name="Update" type="Update"/>
<xs:element name="Delete" type="Delete"/>
</xs:choice>
<xs:attribute name="version" type="xs:string" use="required"/>
<xs:attribute name="store" type="xs:string" use="required"/>
<xs:attribute name="chain" type="xs:string" use="optional"/>
</xs:complexType>
</xs:schema>
例如,如果我有一个带有插入的示例工作表,它无法识别它。操作和插入是实现 IXmlSerializable 的类,第一个类使用自定义 XmlSchemaProvider 检索内部类型的架构集。
我做错了什么吗?如何帮助我的示例表加速操作的成员?它应该实现 IXmlSerializable 以便我可以根据需要构建读取器和编写器,并且架构是否仍然有用?
你没有研究过XmlSchema
,而是研究过XmlSchemaSet
类吗?
我没有在 XML 序列化方面做很多事情,所以我不知道它是否适合您当前的应用程序,但我以前在类似的情况下使用它,我必须引用在 3 个单独的架构中定义的类型。
然后,完整的 XmlSchemaSet
对象将有权访问每个架构中的所有类型。