简体   繁体   中英

using xml type attribute for derived complex types

I'm trying to get derived complex types from a base type in an xsd schema.

it works well when I do this (inspired by this ):

xml file:

     <person
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:type="Employee">
        <name>John</name>
        <height>59</height>
        <jobDescription>manager</jobDescription>
     </person>

xsd file:

     <xs:element name="person" type="Person"/>

         <xs:complexType name="Person" abstract="true">
         <xs:sequence>
            <xs:element name= "name" type="xs:string"/>
            <xs:element name= "height" type="xs:double" />
         </xs:sequence>
         </xs:complexType>

         <xs:complexType name="Employee">
         <xs:complexContent>
             <xs:extension base="Person">
                <xs:sequence>
                   <xs:element name="jobDescription" type="xs:string" />
                </xs:sequence>
              </xs:extension>
          </xs:complexContent>
         </xs:complexType>

However, if I want to have the person element inside, for example, a sequence of another complex type, it doesn't work anymore:

xml:

    <staffRecord>
      <company>mycompany</company>
      <dpt>sales</dpt>
      <person
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:type="Employee">
        <name>John</name>
        <height>59</height>
        <jobDescription>manager</jobDescription>
      </person>
    </staffRecord>

xsd file:

<xs:element name="staffRecord">
    <xs:complexType>
    <xs:sequence>
        <xs:element name="company" type="xs:string"/>
        <xs:element name="dpt" type="xs:string"/>

        <xs:element name="person" type="Person"/>

            <xs:complexType name="Person" abstract="true">
             <xs:sequence>
                <xs:element name= "name" type="xs:string"/>
                <xs:element name= "height" type="xs:double" />
             </xs:sequence>
            </xs:complexType>

            <xs:complexType name="Employee">
             <xs:complexContent>
                <xs:extension base="Person">
                   <xs:sequence>
                      <xs:element name="jobDescription" type="xs:string" />
                   </xs:sequence>
                 </xs:extension>
             </xs:complexContent>
            </xs:complexType>


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

When validating the xml with that schema with xmllint (under linux), I get this error message then:

config.xsd:12: element complexType: Schemas parser error : Element '{ http://www.w3.org/2001/XMLSchema }sequence': The content is not valid. Expected is (annotation?, (element | group | choice | sequence | any)*). WXS schema config.xsd failed to compile

Any idea what is wrong ?

David

The root element of your XML file should have all complex types defined in the namespace.

http://www.datypic.com/books/defxmlschema/chapter13.html

xsd:sequence elements can only contain one of the following list of child elements: at most one annotation , and as many of element, group, choice, sequence, any , as you desire.

Your sequence element has two complexType elements in it, which is invalid.

EDIT: See http://www.w3.org/TR/xmlschema-1/#element-sequence for details.

EDIT 2: A sequence is a sequence of elements , not of types . There is no polymorphism. It is not good enough to state that an element X contains the sequence A,B, and anything that looks a bit like a C, you must state exactly which C-like element you want.

Your options include,

a) Define element elements that correspond to the Person and Employee types at the root level (ie under xs:schema), and refer to them under staffRecord with element[@ref]

b) wrap the two complexType elements in two separate element elements.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM