如何摆脱属性'minOccurs'是不允许的SimpleTypes错误?

时间:2014-07-16 17:51:52

标签: xml xsd

我在验证架构时看到了上述错误

xmllint --noout --schema main.xsd main.xml
main.xsd:44: element element: Schemas parser error : Element     '{http://www.w3.org/2001/XMLSchema}element': The attribute 'minOccurs' is not allowed.
main.xsd:53: element element: Schemas parser error : Element     '{http://www.w3.org/2001/XMLSchema}element': The attribute 'minOccurs' is not allowed.
WXS schema main.xsd failed to compile

我的架构如图所示。 搜索后,我发现在包含元素的复杂类型中可以看到此错误,而不指定序列标记。

我看到这个错误的原因是什么?

 <?xml version="1.0" encoding="UTF-8" ?>
 <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">

<xs:simpleType name="ProtocolType"> 
    <xs:restriction base="xs:string"> 
        <xs:enumeration value="HTTP"/> 
        <xs:enumeration value="HTTPS"/> 
        <xs:enumeration value="SSL"/> 
        <xs:enumeration value="TCP"/>
    </xs:restriction> 
</xs:simpleType>

<xs:simpleType name="URL">
    <xs:restriction base="xs:string">
        <xs:pattern value="[hH][tT]{2}[pP]://[wW]{3}.*"/> 
    </xs:restriction>
</xs:simpleType>

<xs:simpleType name="ipv4">
    <xs:annotation>
        <xs:documentation>
            An IP version 4 address.
        </xs:documentation>
    </xs:annotation>
    <xs:restriction base="xs:token">
    <xs:pattern
        value="(25[0-5]|2[0-4][0-9]|[0-1]?[0-9]?[0-9])\.(25[0-5]|2[0-4][0-9]|[0-1]?[0-9]?[0-9])\.(25[0-5]|2[0-4][0-9]|[0-1]?[0-9]?[0-9])\.(25[0-5]|2[0-4][0-9]|[0-1]?[0-9]?[0-9])"/>
        <xs:pattern
        value="[0-9A-Fa-f]{8}"/>
    </xs:restriction>
</xs:simpleType>

<!-- Server: Either ip adddress or url. 
    We might support more than one here -->
<xs:simpleType name="Server">
    <xs:union memberTypes="URL ipv4" />
</xs:simpleType>

<xs:simpleType name="Protocols">
    <xs:list itemType="ProtocolType" />
</xs:simpleType>

<xs:element name="TotalRunTime" minOccurs="0" default="0"> 
    <xs:simpleType>
        <xs:restriction base="xs:positiveInteger"> 
            <xs:minExclusive value="0" />
            <xs:maxInclusive value="3600"/> 
        </xs:restriction> 
    </xs:simpleType> 
</xs:element> 

<xs:element name="Interface" minOccurs="0" type="xs:string" />

</xs:schema>

3 个答案:

答案 0 :(得分:1)

尝试在根元素中包装这两个element。当您处理列表时,minOccurs仅与真正相关,而xml文档的根则不是。

<xs:element name="root">
   <xs:complexType>
       <xs:all>
           <xs:element name="TotalRunTime" minOccurs="0" default="0"> 
               <xs:simpleType>
                    <xs:restriction base="xs:positiveInteger"> 
                        <xs:minExclusive value="0" />
                        <xs:maxInclusive value="3600"/> 
                    </xs:restriction> 
                </xs:simpleType> 
            </xs:element>

            <xs:element name="Interface" minOccurs="0" type="xs:string" />
        </xs:sequence>
    </xs:complexType>
</xs:element>

答案 1 :(得分:1)

全局元素声明(作为xs:schema的子元素出现)是元素的可重用描述,描述了它们可以包含的内容,而不是它们可以出现的位置。对元素可以出现的位置(以及频率)的约束是一种复杂的类型,它通过声明来利用可重用的描述。这个引用必须包含出现限制,而不是元素声明本身。

Matthew Haugen的答案中使用的表单将元素声明和引用组合成一个单一的构造(一个局部元素声明),它更简洁但不太灵活,因为如果你以后发现它可以不能重复使用相同的元素声明出现在不止一个地方。

答案 2 :(得分:0)

您只能在minOccurs内部的元素上拥有maxOccurscomplexType属性。具有这些属性的元素不能是全局的(架构元素的直接子元素)。