我正在尝试了解如何验证其中包含多个名称空间的 XML 文档并且没有走得太远。作为我正在做的一个简化示例,我在一个命名空间中定义了一个“根”元素,如下所示:
文件: “root.xsd”
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified">
<xs:complexType name="root"/>
<xs:element name="root">
<xs:complexType>
<xs:complexContent>
<xs:extension base="root">
<xs:sequence>
<xs:element ref="allowedChild"/>
</xs:sequence>
</xs:extension>
</xs:complexContent>
</xs:complexType>
</xs:element>
<xs:complexType name="allowedChild"/>
<xs:element name="allowedChild" type="allowedChild"/>
</xs:schema>
然后是这样定义的“子”元素:
文件: “child.xsd”
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified">
<xs:include schemaLocation="root.xsd"/>
<xs:complexType name="child">
<xs:complexContent>
<xs:extension base="allowedChild"/>
</xs:complexContent>
</xs:complexType>
<xs:element name="child" type="child" substitutionGroup="allowedChild"/>
</xs:schema>
还有一个我想验证的 xml,我认为应该如下所示:
<root xmlns="root.xsd">
<child xmlns="child.xsd"/>
</root>
如果我尝试在 XmlSpy 中验证这一点,我会得到“无法在此文档实例中找到对支持的架构类型(DTD、W3C 架构)的引用。”。
我还尝试编写一些 C# 来验证(这是我的最终目标)。我的代码如下所示:
static void Main(string[] args)
{
using (var stream = new StreamReader("Example.xml"))
{
XmlSchemaSet schemaSet = new XmlSchemaSet();
schemaSet.ValidationEventHandler += MyValidationEventHandler;
schemaSet.XmlResolver = new XmlUrlResolver();
schemaSet.Add(null, "root.xsd");
XmlReaderSettings settings = new XmlReaderSettings()
{
ValidationType = ValidationType.Schema,
ValidationFlags = XmlSchemaValidationFlags.ReportValidationWarnings,
Schemas = schemaSet,
};
settings.ValidationEventHandler += MyValidationEventHandler;
XmlReader reader = XmlReader.Create(stream, settings);
while (reader.Read())
{
}
}
}
static void MyValidationEventHandler(object sender, ValidationEventArgs e)
{
}
但这给了我以下验证错误:
Could not find schema information for the element 'root.xsd:root'.
Could not find schema information for the element 'child.xsd:child'.
我希望 XmlUrlResolver 会找到 xsd 文件(保存在同一个文件夹中),但我猜它没有这样做???
我的目标是拥有多个 child.xsd 类型的文件,这些文件在编译时生成并且仅在运行时解析。这可能吗?