简体   繁体   中英

XML Schema with repeating elements

I am trying to deserialise the following XML:

<queries>
    <query name='abc'>
        <statement>SELECT * FROM table1</statement>
        <label row='1' name='id'/>
        <label row='2' name='name'/>
    </query>
    <query name='another'>
        <statement>SELECT * FROM table2</statement>
        <label row='1' name='myTabID'/>
        <label row='2' name='myTabName'/>
    </query>
</queries>

To validate the schema I am using:

<xs:complexType name="Queries">
  <xs:sequence>
    <xs:element name="query" type="Query"/>
  </xs:sequence>
</xs:complexType>

<xs:complexType name="Query">
  <xs:sequence>
    <xs:element name="statement" minOccurs="1" maxOccurs="1"/>
    <xs:element name="label">
      <xs:complexType>
        <xs:attribute name="row" type="xs:int" use="required"/>
        <xs:attribute name="name" type="xs:string" use="required"/>
      </xs:complexType>
    </xs:element>
  </xs:sequence>
  <xs:attribute name="name" type="xs:string"/>
</xs:complexType>

Validation is failing with the message:

Not valid. Error - Line 7, 48: org.xml.sax.SAXParseException; lineNumber: 7; columnNumber: 48; cvc-complex-type.2.4.d: Invalid content was found starting with element 'label'. No child element is expected at this point. Error - Line 9, 31: org.xml.sax.SAXParseException; lineNumber: 9; columnNumber: 31; cvc-complex-type.2.4.d: Invalid content was found starting with element 'query'. No child element is expected at this point.

What am I missing please? Do I need to specify a different tag than sequence? I want to enforce at least one query existing.

Thank you in advanced :)

The error message complains about the definition

<xs:element name="label">

and the use

<label row='1' name='id'/>
<label row='2' name='name'/>

The default values (W3) for minOccurs and maxOccurs is 1, so you can only use one label there. You need to change it if you like to use more labels. Use unbounded for arbitrary amount.

Also note that similar maxOccurs adjustment ( unbounded or greater than 1 ) is needed for query (as commented by @kjhughes )

try this :

  <xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
     <xs:element name="queries">
<xs:complexType>
  <xs:sequence>
    <xs:element name="query" maxOccurs="unbounded" minOccurs="0">
      <xs:complexType>
        <xs:sequence>
          <xs:element type="xs:string" name="statement"/>
          <xs:element name="label" maxOccurs="unbounded" minOccurs="0">
            <xs:complexType>
              <xs:simpleContent>
                <xs:extension base="xs:string">
                  <xs:attribute type="xs:int" name="row" use="optional"/>
                  <xs:attribute type="xs:string" name="name"    use="optional"/>
                </xs:extension>
              </xs:simpleContent>
            </xs:complexType>
          </xs:element>
        </xs:sequence>
        <xs:attribute type="xs:string" name="name" use="optional"/>
      </xs:complexType>
    </xs:element>
  </xs:sequence>
      </xs:complexType>
        </xs:element>
  </xs:schema>

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