XSD。使用无序元素集扩展类型

时间:2017-02-24 11:36:34

标签: xml xsd xsd-validation

我的.xsd文件中有以下元素结构:

<xs:complexType name="the_rootest" abstract="true">
 <xs:sequence>
     <xs:element name="info" type="complex_type_here"/>
 </xs:sequence>
     <xs:attribute name="Name" type="cpo:string"/>
</xs:complexType>

<xs:complexType name="object" abstract="true">
<xs:complexContent>
    <xs:extension base="the_rootest">
        <xs:sequence>
            <xs:element name="is_working" type="cpo:bool"/>
            <xs:element name="has_errors" type="cpo:bool"/>
            <xs:element name="state" type ="cpo:string"/>
        </xs:sequence>
    </xs:extension>
</xs:complexContent>
</xs:complexType>

<xs:complexType name="extended_object">
<xs:complexContent>
    <xs:extension base="object">
        <xs:sequence>
            <xs:element name="is_zero" type="cpo:bool"/>
            <xs:element name="complex" type="another_complex_type_here" />
        </xs:sequence>
    </xs:extension>
</xs:complexContent>
</xs:complexType>

<xs:complexType name="one_more_extended">
<xs:complexContent>
    <xs:extension base="object">
        <xs:sequence>
        </xs:sequence>
    </xs:extension>
</xs:complexContent>
</xs:complexType>

我有一个&#34; extended_object&#34;输入xml文件,其中包含以下字段顺序

info
Name
is_working
has_errors
is_zero
complex
state

正如您所见,&#34;州&#34;字段位于对象元素的末尾。 问题是我应该如何更正我的架构以使该对象有效? 感谢。

2 个答案:

答案 0 :(得分:0)

在内容模型中允许无序元素的常用方法是使用xs:all

但是,xs:all无法扩展。

因此,如果您希望创建一个新元素,其内容模型类似于现有元素,但可能具有与现有元素不同的其他元素,那么您唯一的选择就是创建一个独立于原本的。 (至少可以共享子元素的类型定义。)

XSD的设计不完全正交且一致。这是一个看似合理的期望无法满足的领域。从好的方面来说,在实践中,无序性往往被高估,并且在一份声明中记录与另一个人的依赖性的评论是非理想的但是可行的。

答案 1 :(得分:0)

如果您使用XML Schema 1.1,您可以使用xs:all这样的扩展名(我修改了架构,使其适用于我的标准类型):

<?xml version="1.0" encoding="utf-8"?>
<xs:schema
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xmlns:xsd="http://www.w3.org/2001/XMLSchema"
  xmlns:xs="http://www.w3.org/2001/XMLSchema"
  xmlns:vc="http://www.w3.org/2007/XMLSchema-versioning"
  vc:minVersion="1.1">
    <xs:complexType name="the_rootest" abstract="true">
        <xs:all>
            <xs:element name="info" type="xs:string"/>
        </xs:all>
        <xs:attribute name="Name" type="xs:string"/>
    </xs:complexType>

    <xs:complexType name="object" abstract="true">
        <xs:complexContent>
            <xs:extension base="the_rootest">
                <xs:all>
                    <xs:element name="is_working" type="xs:boolean"/>
                    <xs:element name="has_errors" type="xs:boolean"/>
                    <xs:element name="state" type ="xs:string"/>
                </xs:all>
            </xs:extension>
        </xs:complexContent>
    </xs:complexType>

    <xs:complexType name="extended_object">
        <xs:complexContent>
            <xs:extension base="object">
                <xs:all>
                    <xs:element name="is_zero" type="xs:boolean"/>
                    <xs:element name="complex" type="xs:string" />
                </xs:all>
            </xs:extension>
        </xs:complexContent>
    </xs:complexType>

    <xs:complexType name="one_more_extended">
        <xs:complexContent>
            <xs:extension base="object">
                <xs:sequence>
                </xs:sequence>
            </xs:extension>
        </xs:complexContent>
    </xs:complexType>

    <xs:element name="element" type="extended_object"/>
</xs:schema>

此XML文档成功验证:

<?xml version="1.0" encoding="UTF-8"?>
<element xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:noNamespaceSchemaLocation="test.xsd"
 >
    <info>test</info>
    <is_working>true</is_working>
    <has_errors>true</has_errors>
    <is_zero>true</is_zero>
    <complex>true</complex>
    <state>true</state>
</element>