这是一个 XSD:
<?xml version="1.0"?>
<xsd:schema
elementFormDefault='unqualified'
attributeFormDefault='unqualified'
xmlns:xsd='http://www.w3.org/2001/XMLSchema'
>
<xsd:simpleType name='TheSimpleType'>
<xsd:restriction base='xsd:string' />
</xsd:simpleType>
</xsd:schema>
这是包含上述 XSD 的第二个 XSD:
<?xml version="1.0" encoding="UTF-8" ?>
<xsd:schema
elementFormDefault='unqualified'
attributeFormDefault='unqualified'
xmlns:xsd='http://www.w3.org/2001/XMLSchema'
targetNamespace='a'
xmlns='a'
>
<xsd:include schemaLocation='Include.xsd' />
<xsd:element name = "TheElement" >
<xsd:complexType>
<xsd:attribute name="Code" type="TheSimpleType" use="required"/>
</xsd:complexType>
</xsd:element>
</xsd:schema>
我需要将(第二个)XSD 读入 C# 并且:
- 检查它是否是有效的 XSD,并且
- 验证文件。
下面是一些要在模式中读取的 C#:
XmlSchemaSet schemaSet = new XmlSchemaSet();
foreach (string sd in Schemas)
{
using (XmlReader r = XmlReader.Create(new FileStream(sd, FileMode.Open)))
{
schemaSet.Add(XmlSchema.Read(r, null));
}
}
schemaSet.CompilationSettings = new XmlSchemaCompilationSettings();
schemaSet.Compile();
.Compile() 失败,因为“类型 'a:TheSimpleType' 未声明,或者不是简单类型。”
但是,如果有以下任何一种情况,它就会起作用:
- 命名空间已从架构中删除,或者
- 命名空间被添加到包含中。
问题是:如何在不编辑模式的情况下让 C# 接受它?
我怀疑问题在于,虽然我已将两个模式都放入 XmlSchemaSet,但我仍然需要告诉 C# 一个包含在另一个中,即它自己没有解决。事实上,如果我只告诉 XmlSchemaSet 主 XSD(而不是包含)(都没有(或有)命名空间),那么“类型 'TheSimpleType' 没有声明,或者不是简单类型。”
因此,这似乎是一个关于解决的问题,包括:如何?!