tags:

views:

160

answers:

2

Hi All,

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

+2  A: 

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

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

Arnej65
There is no need to separate the definition of types from the definition of elements. If a given type is only used in one element, then it can just be defined within that element.
Paul Butcher
A: 

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 (i.e. under xs:schema), and refer to them under staffRecord with element[@ref]

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

Paul Butcher
yeah, well I can read the error message... that doesn't help in solving the problem though
DavidM
You asked what was wrong, my answer was complete. It does help solve the problem, all you have to do is choose an element from the list of allowable elements, and use that instead.I have now updated my answer to give two potential solutions.
Paul Butcher
so, if someone posts something like "I get a 'compilation error', what's wrong?", you are going to reply "it happens because you compiler encountered an error"... very useful
DavidM
That depends. With that exact question, then yes. With a question like yours, I will (as I did for you) attempt to help you interpret that error message, as it looked like you had trouble understanding it.This is a Question and Answer site, you ask questions and get answers to those questions. If you want an answer to a different question, ask that question instead.
Paul Butcher
again, a very useful answer
DavidM