XML Schema验证的奇怪的无意义错误(XSD代码本身)

时间:2011-06-07 23:35:10

标签: xml validation xsd

我很难让我的XML模式进行验证。

Validome XML架构验证器给出了以下错误:

Attribute 'use' is not permitted to appear in element 'xs:attribute'.

换行

<xs:attribute name="graphtype" use="required">

这让我觉得defined in the specs成为xs:attribute的xsd属性。

我尝试在外部定义xs:attribute,如下所示:

<xs:attribute name="graphtype">
    ...
</xs:attribute>

并在我的架构中引用它,如下所示:

<xs:attribute ref="graphtype" use="required" />

Validome 告诉我ref中不允许xs:attribute,但name是必需的。在我的书中,这又是完全废话。

这是我第一次使用XML Schema,所以我有点难过。

在相关的说明中:那里的交易基本上没有(官方)XSD验证器? 如果我无法首先验证我的XSD ,我该如何使用XSD验证XML ?的 WTF吗
(只是要明确:不是一个真正的问题。但仍然, WTF?

这是我的架构:

<?xml version="1.0"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns="http://example.com" targetNamespace="http://example.com" elementFormDefault="qualified">

    <xs:element name="dlgkml">
        <xs:complexType>
            <xs:sequence>

                <!--graphs-->
                <xs:element name="graphs">
                    <xs:complexType>
                        <xs:all>
                            <xs:element name="graph" minOccurs="1">
                                <xs:complexType>
                                    <xs:all>
                                        <xs:element name="data" type="xs:byte" />
                                    </xs:all>
                                    <xs:attribute name="id" type="xs:nonNegativeInteger" use="required" />
                                </xs:complexType>
                            </xs:element>
                        </xs:all>
                    </xs:complexType>
                </xs:element>

                <!--vertices-->
                <xs:element name="vertices">
                    <xs:complexType>
                        <xs:sequence>
                            <xs:element name="vertex" minOccurs="1">
                                <xs:complexType>
                                    <xs:all>
                                        <xs:element name="owners">
                                            <xs:complexType>
                                                <xs:all>
                                                    <xs:element name="id" minOccurs="1">
                                                    </xs:element>
                                                </xs:all>
                                            </xs:complexType>
                                        </xs:element>
                                        <xs:element name="data" type="xs:byte" />

                                        <xs:attribute name="id" type="xs:nonNegativeInteger" use="required" />
                                        <xs:attribute name="capacity" type="xs:double" default="0.0" />
                                        <xs:attribute name="size" type="xs:double" default="0.0" />
                                        <xs:attribute name="weight" type="xs:double" default="0.0" />
                                        <xs:attribute name="graphtype" use="required">
                                            <xs:simpleType>
                                                <xs:restriction base="xs:string">
                                                    <xs:enumeration value="hypergraph" />
                                                    <xs:enumeration value="graph" />
                                                    <xs:enumeration value="tree" />
                                                </xs:restriction>
                                            </xs:simpleType>
                                        </xs:attribute>
                                    </xs:all>
                                </xs:complexType>
                            </xs:element>
                        </xs:sequence>
                    </xs:complexType>
                </xs:element>

                <!--edges-->
                <xs:element name="edges">
                    <xs:complexType>
                        <xs:sequence>
                            <xs:element name="edge" minOccurs="1">
                                <xs:complexType>                                    
                                    <xs:all>
                                        <xs:element name="tail">
                                            <xs:complexType>
                                                <xs:all>
                                                    <xs:element name="id" minOccurs="1" />
                                                </xs:all>
                                            </xs:complexType>
                                        </xs:element>
                                        <xs:element name="head">
                                            <xs:complexType>
                                                <xs:all>
                                                    <xs:element name="id" minOccurs="1" />
                                                </xs:all>
                                            </xs:complexType>
                                        </xs:element>
                                        <xs:element name="owners">
                                            <xs:complexType>
                                                <xs:all>
                                                    <xs:element name="id" minOccurs="1" />
                                                </xs:all>
                                            </xs:complexType>
                                        </xs:element>
                                        <xs:element name="data" type="xs:byte" />
                                    </xs:all>

                                    <xs:attribute name="id" type="xs:nonNegativeInteger" use="required" />
                                    <xs:attribute name="capacity" type="xs:double" default="0.0" />
                                    <xs:attribute name="size" type="xs:double" default="0.0" />
                                    <xs:attribute name="weight" type="xs:double" default="0.0" />
                                    <xs:attribute ref="graphtype" use="required" />
                                    <xs:attribute name="edgetype" use="required">
                                        <xs:simpleType>
                                            <xs:restriction base="xs:string">
                                                <xs:enumeration value="undirected" />
                                                <xs:enumeration value="directed" />
                                                <xs:enumeration value="bidirected" />
                                            </xs:restriction>
                                        </xs:simpleType>
                                    </xs:attribute>

                                </xs:complexType>
                            </xs:element>
                        </xs:sequence>
                    </xs:complexType>
                </xs:element>

            </xs:sequence>
        </xs:complexType>
    </xs:element>

</xs:schema>

2 个答案:

答案 0 :(得分:4)

此验证器的错误消息的相关部分实际上是:

  

从元素'xs:attribute'开始找到无效内容。预计会有一个'{“http://www.w3.org/2001/XMLSchema":element}'。

换句话说,你不能在那里使用xs:attributexs:all内)。

我相信它会决定继续,假设你真的打算写xs:element,那就是关于use的投诉来自哪里。

顺便提一下,您的文档链接不符合实际的XML Schema规范。这是可用的here,虽然它并不是特别容易理解。无论如何,它xs:all的{​​{3}}:

<xsd:complexType name="PurchaseOrderType">
  <xsd:all>
    <xsd:element name="shipTo" type="USAddress"/>
    <xsd:element name="billTo" type="USAddress"/>
    <xsd:element ref="comment" minOccurs="0"/>
    <xsd:element name="items"  type="Items"/>
  </xsd:all>
  <xsd:attribute name="orderDate" type="xsd:date"/>
</xsd:complexType>

请注意,该属性不在xs:all之内,而是直接位于xs:complexType

之下

答案 1 :(得分:1)

您可能会发现Saxon的错误消息更具信息性:

Error at xs:attribute on line 41 column 111 of test.xsd:
  Element <xs:attribute> is not allowed as a child of <xs:all>
Error at xs:attribute on line 42 column 104 of test.xsd:
  Element <xs:attribute> is not allowed as a child of <xs:all>
Error at xs:attribute on line 43 column 100 of test.xsd:
  Element <xs:attribute> is not allowed as a child of <xs:all>
Error at xs:attribute on line 44 column 102 of test.xsd:
  Element <xs:attribute> is not allowed as a child of <xs:all>
Error at xs:attribute on line 45 column 87 of test.xsd:
  Element <xs:attribute> is not allowed as a child of <xs:all>
Schema processing failed: 5 errors were found while processing the schema

W3C托管了一个XSD验证服务。我不记得这个URL。我不会将其描述为“官方” - 如果您发现它有用,它就可以使用。

顺便说一下,即使是缩写形式,我也不喜欢粗言秽语。