Richard Knop
Richard Knop

Reputation: 83725

Is it possible to rewrite this XSD in a simpler way?

I have this XSD to validate incoming requests to my api:

<?xml version="1.0"?>
<xs:schema version="1.0"
           xmlns:xs="http://www.w3.org/2001/XMLSchema"
           elementFormDefault="qualified">
    <xs:element name="request">
        <xs:complexType>
            <xs:sequence>
                <xs:element name="amenity">
                    <xs:complexType>
                        <xs:sequence>
                            <xs:element name="description" type="xs:string" />
                        </xs:sequence>
                    </xs:complexType>
                </xs:element>
            </xs:sequence>
        </xs:complexType>
    </xs:element>
</xs:schema>

But it seems kind of cluttered. Too many nested elements etc. Is it possible to rewrite it in a simpler, less confusing way?

Upvotes: 0

Views: 82

Answers (2)

Rookie Programmer Aravind
Rookie Programmer Aravind

Reputation: 12154

Yes there is an alternative way ..

It is to define each entity as a ComplexType give it a name, and use as a TYPE :)

here is ur sample xml and xsd
XML:

<request>
  <amenity>
    <description>text</description>
  </amenity>
</request>

XSD

<?xml version="1.0" encoding="utf-8"?>
<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="request" type="request"/>

  <xs:complexType name="request">
    <xs:sequence>
      <xs:element name="amenity" type="amenity"/>
    </xs:sequence>
  </xs:complexType>  

    <xs:complexType name="amenity">
      <xs:sequence>
              <xs:element name="description" type="xs:string" />
      </xs:sequence>
    </xs:complexType>
</xs:schema>


Some more explanation:
suppose your xml is like this:

<?xml version="1.0" encoding="utf-8"?>
<request>
  <amenity>
    <description>text</description>
    <foo>text</foo>
  </amenity>
  <foobar>
    <amenity2>
      <description>text2</description>
      <foo>text3</foo>
    </amenity2>
  </foobar>
</request>

Your XSD would be really simpler .. because you don't have to define <descirption/> and <foo/> tags two times :)
observe that I am using Type="General" multiple times :)

<?xml version="1.0" encoding="utf-8"?>
<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="request" type="request"/>

  <xs:complexType name="request">
    <xs:sequence>
      <xs:element name="amenity" type="General"/>
      <xs:element name="foobar" type="foobar"/>
    </xs:sequence>
  </xs:complexType>

  <xs:complexType name="General">
    <xs:sequence>
      <xs:element name="description" type="xs:string" />
      <xs:element name="foo" type="xs:string" />
    </xs:sequence>
  </xs:complexType>

  <xs:complexType name="foobar">
    <xs:sequence>
      <xs:element name="amenity2" type="General"/>
    </xs:sequence>
  </xs:complexType>

</xs:schema>

Upvotes: 0

Michael Kay
Michael Kay

Reputation: 163418

If you don't want it so deeply nested, you can change the complex types to be named types and then refer to them by name from the element declarations. That has benefits in that the types can then be reused. But it won't make this simple schema any simpler...

Upvotes: 1

Related Questions