0

我正在尝试了解如何验证其中包含多个名称空间的 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 类型的文件,这些文件在编译时生成并且仅在运行时解析。这可能吗?

4

1 回答 1

1

你需要这样的东西:

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" 
    attributeFormDefault="unqualified" 
    targetNamespace="http://root.schemas.mycompany.com">

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" 
    attributeFormDefault="unqualified" 
    targetNamespace="http://child.schemas.mycompany.com">

<root xmlns="http://root.schemas.mycompany.com">
    <child xmlns="http://child.schemas.mycompany.com"/>
</root>

您将 XSD 文件名视为命名空间名称,这是不正确的。此外,由于您没有 using targetNamespace,因此您的 XML 类型和元素根本不属于任何命名空间。

于 2013-09-25T15:36:58.637 回答