Reputation: 83725
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
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
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