我很难让我的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>
答案 0 :(得分:4)
此验证器的错误消息的相关部分实际上是:
从元素'xs:attribute'开始找到无效内容。预计会有一个'{“http://www.w3.org/2001/XMLSchema":element}'。
换句话说,你不能在那里使用xs:attribute
(xs: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。我不会将其描述为“官方” - 如果您发现它有用,它就可以使用。
顺便说一下,即使是缩写形式,我也不喜欢粗言秽语。