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.
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.