xml - Specify root element with general child element in XSD -
i have base class child elements in xsd
<xs:complextype name="baseitem"> <xs:attribute name="id" type="string" use="required"/> </xs:complextype>
and extenders of element
<xs:complextype name="package"> <xs:complexcontent> <xs:extension base="baseitem"> <xs:sequence> <xs:element name="subelement" type="subelementtype"/> </xs:sequence> </xs:extension> </xs:complexcontent> </xs:complextype> <xs:complextype name="class"> <xs:complexcontent> <xs:extension base="baseitem"> <xs:sequence> <xs:element name="subelement2" type="subelementtype2"/> </xs:sequence> </xs:extension> </xs:complexcontent> </xs:complextype> ....... etc....
and xml examples xsd:
xml1: <root><package id="xxx"><subelement/></package></root>
xml2: <root><class id="xxx"><subelement2/></class></root>
xml3: <root><method id="xxx"><subelement3/></method></root>
xml4: <root><method id="xxx"><subelement3/></method></root>
how can specify root element in xsd without defining possible children?
<xs:element name="root"> <xs:complextype> <xs:sequence> //????? </xs:sequence> </xs:complextype> </xs:element>
is way specify children through base type? smth:
<xs:element name="root"> <xs:complextype> <xs:sequence> <element type="baseitem"/> </xs:sequence> </xs:complextype> </xs:element>
or without specifying name of element impossible?
you use substitution group (http://www.w3schools.com/schema/schema_complex_subst.asp) in way
<?xml version="1.0" encoding="utf-8"?> <xs:schema xmlns:xs="http://www.w3.org/2001/xmlschema" elementformdefault="qualified" attributeformdefault="unqualified"> <xs:complextype name="base_item_type"> <xs:attribute name="id" type="xs:string" use="required"/> </xs:complextype> <xs:complextype name="package_type"> <xs:complexcontent> <xs:extension base="base_item_type"> <xs:sequence> <xs:element name="subelement" type="xs:string"/> </xs:sequence> </xs:extension> </xs:complexcontent> </xs:complextype> <xs:complextype name="class_type"> <xs:complexcontent> <xs:extension base="base_item_type"> <xs:sequence> <xs:element name="subelement2" type="xs:string"/> </xs:sequence> </xs:extension> </xs:complexcontent> </xs:complextype> <!-- abstract attribute prevent occurence of baseelement--> <xs:element name="baseelement" type="base_item_type" abstract="true"/> <!-- package , class element might used instead of baseelement--> <!-- can put root element --> <xs:element name="package" type="package_type" substitutiongroup="baseelement" /> <xs:element name="class" type="class_type" substitutiongroup="baseelement"/> <!-- root element --> <xs:element name="rootelement"> <xs:complextype> <xs:sequence> <xs:element ref="baseelement" maxoccurs="unbounded" /> </xs:sequence> </xs:complextype> </xs:element> </xs:schema>
but i'm not sure if better choice in root element - because in way "package" , "class" can put root element directly. prefer 1 root element (although bigger) choice.
Comments
Post a Comment