使用“choice”和“extension”元素验证XSD的问题

时间:2010-03-12 16:01:39

标签: xml xsd

我将发布两个例子,一个验证,一个不验证。我有兴趣了解为什么第二个不起作用,因为它们非常相似。

示例1 (验证)

XSD:

<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" >
  <xsd:element name="root" type="BBB"/>
    <xsd:complexType name="AAA">
      <xsd:choice maxOccurs="2">
        <xsd:element name="x" type="xsd:string"/>
        <xsd:element name="y" type="xsd:string"/>
      </xsd:choice>
    </xsd:complexType>
  <xsd:complexType name="BBB">
    <xsd:complexContent>
      <xsd:extension base="AAA"/>
    </xsd:complexContent>
  </xsd:complexType>
</xsd:schema>

XML:

<root xsi:noNamespaceSchemaLocation="incorrect.xsd" xmlns="" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" >
   <x>1</x>
   <y>1</y>
</root>

示例2 (不验证)

XSD:

<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" >
   <xsd:element name="root" type="BBB"/>
   <xsd:complexType name="AAA">
      <xsd:choice maxOccurs="2">
         <xsd:element name="x" type="xsd:string"/>
         <xsd:element name="y" type="xsd:string"/>
      </xsd:choice>
   </xsd:complexType>
   <xsd:complexType name="BBB">
      <xsd:complexContent>
         <xsd:extension base="AAA">
            <xsd:choice>
               <xsd:element name="z" type="xsd:string"/>
            </xsd:choice>
         </xsd:extension>
      </xsd:complexContent>
   </xsd:complexType>
</xsd:schema>

xml:(与示例1相同)

<root xsi:noNamespaceSchemaLocation="incorrect.xsd" xmlns="" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" >
   <x>1</x>
   <y>1</y>
</root>

为了节省你对xsd运行diff的时间,唯一的区别是在第二个例子中复杂类型BBB有一个<choice>

xmllint 说明以下关于示例2:

  

$ xmllint --noout --schema example2.xsd example2.xml

     

example2.xml:3:元素y:架构有效性错误:元素'y':不期望此元素。预计是(z)。

     

example2.xml无法验证


松散地基于http://www.zvon.org/xxl/XMLSchemaTutorial/Output/ser_ext_patterns_st1.html

的示例

1 个答案:

答案 0 :(得分:1)

在您的无效案例的xml中,您缺少必需的“z”元素。

<root xsi:noNamespaceSchemaLocation="incorrect.xsd" xmlns="" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" >
   <x>1</x>
   <y>1</y>
   <z>1</z>
</root>

DecisionsSoft's Validatorxmlme's validator

上进行验证