3

我的 XSD 出现问题,当我将代码输入 XSD 验证器时出现此错误:“no-xmlns:属性声明的 {name} 不得匹配 'xmlns'。”

这是我的 XML:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <xs:element name="Test">
        <xs:complexType>
            <xs:attribute name="xmlns" type="xs:string" use="required"/>
            <xs:sequence>
                <xs:choice minOccurs="1" maxOccurs="unbounded">
                    <xs:element name="Screens" minOccurs="0" maxOccurs="unbounded">
                        <xs:complexType>
                            <xs:sequence>
                                <xs:element name="Screen" minOccurs="1" maxOccurs="unbounded">
                                    <xs:complexType>
                                        <xs:attribute name="name" type="xs:string" use="required"/>
                                        <xs:attribute name="package" type="xs:string" use="required"/>
                                        <xs:attribute name="class" type="xs:string" use="required"/>
                                        <xs:sequence>
                                            <xs:element name="ScreenData" minOccurs="1" maxOccurs="unbounded">
                                                <xs:complexType>
                                                    <xs:attribute name="step" type="xs:int" use="required"/>
                                                    <xs:attribute name="description" type="xs:string" use="required"/>
                                                    <xs:sequence>
                                                        <xs:element name="element" minOccurs="1" maxOccurs="unbounded">
                                                            <xs:complexType>
                                                                <xs:attribute name="name" type="xs:string" use="required"/>
                                                                <xs:attribute name="type" type="xs:string" use="required"/>
                                                                <xs:attribute name="value" type="xs:string" use="required"/>
                                                            </xs:complexType>
                                                        </xs:element>
                                                    </xs:sequence>
                                                </xs:complexType>
                                            </xs:element>
                                        </xs:sequence>
                                    </xs:complexType>
                                </xs:element>
                            </xs:sequence>
                        </xs:complexType>
                    </xs:element>
                    <xs:element name="DBSession" minOccurs="0" maxOccurs="unbounded">
                        <xs:complexType>
                            <xs:attribute name="use_test.properties" type="xs:boolean" use="required"/>
                            <xs:attribute name="use_dbserver" type="xs:string" use="required"/>
                            <xs:attribute name="use_db" type="xs:string" use="required"/>
                            <xs:sequence>
                                <xs:element name="login" minOccurs="1" maxOccurs="1">
                                    <xs:complexType>
                                        <xs:attribute name="server" type="xs:string" use="required"/>
                                        <xs:attribute name="database" type="xs:string" use="required"/>
                                        <xs:attribute name="username" type="xs:string" use="required"/>
                                        <xs:attribute name="password" type="xs:string" use="required"/>
                                        <xs:sequence>
                                            <xs:element name="Queries" minOccurs="1" maxOccurs="1">
                                                <xs:complexType>
                                                    <xs:sequence>
                                                        <xs:attribute name="query" type="xs:string" use="required"/>
                                                        <xs:attribute name="expectedResults" type="xs:string" use="required"/>
                                                    </xs:sequence>
                                                </xs:complexType>
                                            </xs:element>
                                        </xs:sequence>
                                    </xs:complexType>
                                </xs:element>
                            </xs:sequence>
                        </xs:complexType>
                    </xs:element>
                    <xs:element name="CLISession" minOccurs="0" maxOccurs="unbounded">
                        <xs:complexType>
                            <xs:attribute name="use_test.properties" type="xs:boolean" use="required"/>
                            <xs:sequence>
                                <xs:element name="login" minOccurs="1" maxOccurs="unbounded">
                                    <xs:complexType>
                                        <xs:attribute name="host" type="xs:string" use="required"/>
                                        <xs:attribute name="password" type="xs:string" use="required"/>
                                        <xs:attribute name="username" type="xs:string" use="required"/>
                                        <xs:sequence>
                                            <xs:element name="Commands" minOccurs="1" maxOccurs="1">
                                                <xs:complexType>
                                                    <xs:sequence>
                                                        <xs:element name="Command" minOccurs="1" maxOccurs="unbounded">
                                                            <xs:complexType>
                                                                <xs:attribute name="exe" type="xs:string" use="required"/>
                                                                <xs:attribute name="args" type="xs:string" use="required"/>
                                                                <xs:attribute name="wait" type="xs:int" use="required"/>
                                                                <xs:attribute name="expectedOutput" type="xs:string" use="required"/>
                                                                <xs:attribute name="toVariable" type="xs:string" use="required"/>
                                                            </xs:complexType>
                                                        </xs:element>
                                                    </xs:sequence>
                                                </xs:complexType>
                                            </xs:element>
                                        </xs:sequence>
                                    </xs:complexType>
                                </xs:element>
                            </xs:sequence>
                        </xs:complexType>
                    </xs:element>
                </xs:choice>
            </xs:sequence>
        </xs:complexType>
    </xs:element>
</xs:schema>

我假设这与模式中的第二行代码有关。此行与我的 XML 文档中的以下行相关:

<Test xmlns="http://MyURL">
4

1 回答 1

5

问题出在您的架构中。只需删除该行:

<xs:attribute name="xmlns" type="xs:string" use="required"/>

XML 文档是正确的。在您的文档中,您选择http://MyURL通过分配 value 属性将 URI 绑定到默认命名空间xmlns。这很好,正如XML 1.0 中的命名空间中所解释的那样。

命名空间是特殊的。请参阅XML Schema Part 1的最后一段:3.2.1 属性详细信息

[XML-Infoset] 将具有 xmlns 或 xmlns:xsl 等名称的属性与普通属性区分开来,将它们标识为 [namespace attributes]。因此,模式没有必要也实际上不可能包含与此类命名空间声明相对应的属性声明,请参阅 xmlns Not Allowed (§3.2.6)。本规范中没有提供任何方法来为命名空间声明提供默认值。

您编写的架构中的所有内容都在您声明它的名称空间中,因此实际上没有必要束缚文档编写者以完全那样声明它。他们可以在更高级别的元素上声明命名空间。或者他们可以将其绑定到不同的命名空间前缀。

顺便说一句,您可能应该按照XML Schema PrimertargetNamespace中的说明在最顶层schema元素上设置来在文档中声明模式的命名空间

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" targetNamespace="http://MyURL">
于 2012-08-16T21:20:35.003 回答