Rules for Schema:
<?xml version="1.0"?>
<Slams ...>
<slam name="Australia" year="2012">
<winner>Djokovic</winner>
<runnerUp>Nadal</runnerUp>
<score>5-76-46-26-77-5</score>
<surface>Rebound Ace</surface>
<semiFinalist>Federer</semiFinalist>
<semiFinalist>Murray</semiFinalist>
</slam>
<slam name="French Open" year="2012">
<winner>Nadal</winner>
<runnerUp>Djokovic</runnerUp>
<score>6-46-32-67-5</score>
<surface>Clay</surface>
<semiFinalist>Federer</semiFinalist>
<semiFinalist>Ferrer</semiFinalist>
</slam>
<slam name="Wimbledon" year="2012">
<winner>Federer</winner>
<runnerUp>Murray</runnerUp>
<score>4-67-56-36-4</score>
<surface>Grass</surface>
<semiFinalist>Djokovic</semiFinalist>
<semiFinalist>Tsonga</semiFinalist>
</slam>
<slam name="US Open" year="2012">
<winner>Murray</winner>
<runnerUp>Djokovic</runnerUp>
<score>7-67-52-63-66-2</score>
<surface>Hard Court</surface>
<semiFinalist>Berdych</semiFinalist>
<semiFinalist>Ferrer</semiFinalist>
</slam>
</Slams>
This is what I have got so far but I'm not sure if it is correct.
<?xml version="1.0" encoding="UTF-8" ?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
targetNamespace="http://www.w3schools.com"
xmlns="http://www.w3schools.com"
elementFormDefault="qualified">
<xs:element name="Australia">
<xs:complexType>
<xs:sequence>
<xs:element name="winner" type="xs:string"/>
<xs:element name="runnerUp" type="xs:string"/>
<xs:element name="score" type="xs:string"/>
<xs:element name="surface" type="xs:string"/>
<xs:element name="semiFinalist" type="xs:string"/>
<xs:element name="semiFinalist" type="xs:string"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="French Open">
<xs:complexType>
<xs:sequence>
<xs:element name="winner" type="xs:string"/>
<xs:element name="runnerUp" type="xs:string"/>
<xs:element name="score" type="xs:string"/>
<xs:element name="surface" type="xs:string"/>
<xs:element name="semiFinalist" type="xs:string"/>
<xs:element name="semiFinalist" type="xs:string"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="Wimbledon">
<xs:complexType>
<xs:sequence>
<xs:element name="winner" type="xs:string"/>
<xs:element name="runnerUp" type="xs:string"/>
<xs:element name="score" type="xs:string"/>
<xs:element name="surface" type="xs:string"/>
<xs:element name="semiFinalist" type="xs:string"/>
<xs:element name="semiFinalist" type="xs:string"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="US Open">
<xs:complexType>
<xs:sequence>
<xs:element name="winner" type="xs:string"/>
<xs:element name="runnerUp" type="xs:string"/>
<xs:element name="score" type="xs:string"/>
<xs:element name="surface" type="xs:string"/>
<xs:element name="semiFinalist" type="xs:string"/>
<xs:element name="semiFinalist" type="xs:string"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
Problems to fix:
#1
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
targetNamespace="http://www.w3schools.com"
xmlns="http://www.w3schools.com"
elementFormDefault="qualified">
to
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www.w3schools.com"
xmlns="http://www.w3schools.com"
elementFormDefault="qualified">
#2
Define a single slam
element, with an name
attribute, not disparate elements for each such named possibility. Also add a year
attribute.
#3
Your XML (as far as you've shown) doesn't use namespaces, so remove that these lines from your XSD xs:schema
element:
targetNamespace="http://www.w3schools.com"
xmlns="http://www.w3schools.com"
#4
Place slam
element within Slams
element declaration, and use maxOccurs="unbounded"
. Use maxOccurs="2"
(or 3 or unbounded
) for semiFinalist
rather than repeating the element declaration in slam
.
<?xml version="1.0" encoding="UTF-8" ?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
elementFormDefault="qualified">
<xs:element name="Slams">
<xs:complexType>
<xs:sequence>
<xs:element name="slam" maxOccurs="unbounded">
<xs:complexType>
<xs:sequence>
<xs:element name="winner" type="xs:string"/>
<xs:element name="runnerUp" type="xs:string"/>
<xs:element name="score" type="xs:string"/>
<xs:element name="surface" type="xs:string"/>
<xs:element name="semiFinalist" type="xs:string"
maxOccurs="unbounded"/>
</xs:sequence>
<xs:attribute name="name" type="xs:string"/>
<xs:attribute name="year" type="xs:integer"/>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
This will get you an XSD that validates your XML.
Left as an exercise for the reader: Tune it to meet the given Rules for Schema.