XML -zelfstudie

XML HOME XML-introductie XML Hoe te gebruiken XML-structuur XML-syntaxis XML-elementen XML-kenmerken XML-naamruimten XML-weergave XML HTTP-verzoek XML-parser XML-DOM XML XPath XML XSLT XML XQuery XML XLink XML-validator XML-DTD XML Schema XML-server XML-voorbeelden XML-quiz XML-certificaat

XML AJAX

Ajax-introductie AJAX XMLHttp Ajax-verzoek Ajax-reactie AJAX XML-bestand AJAX PHP Ajax ASP AJAX-database AJAX-toepassingen Ajax-voorbeelden

XML-DOM

DOM-introductie DOM-knooppunten DOM-toegang DOM Node Info Lijst met DOM-knooppunten DOM doorkruisen DOM-navigatie DOM Waarden ophalen DOM-wijzigingsknooppunten DOM Knooppunten verwijderen DOM Knooppunten vervangen DOM Knooppunten maken DOM Knooppunten toevoegen DOM-kloonknooppunten DOM-voorbeelden

XPath- zelfstudie

XPath-introductie XPath-knooppunten XPath-syntaxis XPath-assen XPath-operators XPath-voorbeelden

XSLT- zelfstudie

XSLT-introductie XSL-talen XSLT-transformatie XSLT <sjabloon> XSLT <waarde-van> XSLT <voor elk> XSLT <sorteren> XSLT <if> XSLT <kiezen> XSLT toepassen XSLT op de client XSLT op de server XSLT Bewerk XML XSLT-voorbeelden

XQuery- zelfstudie

XQuery-introductie XQuery-voorbeeld XQuery FLWOR XQuery HTML XQuery-voorwaarden XQuery-syntaxis XQuery toevoegen XQuery selecteren XQuery-functies

XML -DTD

DTD Introductie DTD-bouwstenen DTD-elementen DTD-kenmerken DTD Elements vs Attr DTD-entiteiten DTD-voorbeelden

XSD- schema

XSD-introductie XSD Hoe kan ik? XSD <schema> XSD-elementen XSD-kenmerken XSD-beperkingen

XSD- complex

XSD-elementen XSD Leeg Alleen XSD-elementen Alleen XSD-tekst XSD gemengd XSD-indicatoren XSD <elke> XSD <anyAttribute> XSD-vervanging XSD-voorbeeld

XSD- gegevens

XSD-string XSD-datum XSD Numeriek XSD Diversen XSD-referentie

Webservices _

XML-services XML-WSDL XML SOAP XML-RDF XML-RSS

Referenties

Typen DOM-knooppunten DOM Node DOM-knooppuntlijst DOM NamedNodeMap DOM-document DOM-element DOM-kenmerk DOM-tekst DOM CDATA DOM-opmerking DOM XMLHttpRequest DOM-parser XSLT-elementen XSLT/XPath-functies

Een XSD- voorbeeld


Dit hoofdstuk laat zien hoe u een XML-schema schrijft. Ook leer je dat een schema op verschillende manieren geschreven kan worden.


Een XML-document

Laten we eens kijken naar dit XML-document genaamd "shiporder.xml":

<?xml version="1.0" encoding="UTF-8"?>

<shiporder orderid="889923"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="shiporder.xsd">
  <orderperson>John Smith</orderperson>
  <shipto>
    <name>Ola Nordmann</name>
    <address>Langgt 23</address>
    <city>4000 Stavanger</city>
    <country>Norway</country>
  </shipto>
  <item>
    <title>Empire Burlesque</title>
    <note>Special Edition</note>
    <quantity>1</quantity>
    <price>10.90</price>
  </item>
  <item>
    <title>Hide your heart</title>
    <quantity>1</quantity>
    <price>9.90</price>
  </item>
</shiporder>

Het bovenstaande XML-document bestaat uit een root-element, "shiporder", dat een vereist attribuut met de naam "orderid" bevat. Het element "shiporder" bevat drie verschillende onderliggende elementen: "orderperson", "shipto" en "item". Het "item"-element verschijnt twee keer en bevat een "title", een optioneel "note"-element, een "quantity" en een "price"-element.

De regel hierboven: xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" vertelt de XML-parser dat dit document moet worden gevalideerd tegen een schema. De regel: xsi:noNamespaceSchemaLocation="shiporder.xsd" specificeert WAAR het schema zich bevindt (hier is het in dezelfde map als "shiporder.xml").



Een XML-schema maken

Nu willen we een schema maken voor het XML-document hierboven.

We beginnen met het openen van een nieuw bestand dat we "shiporder.xsd" zullen noemen. Om het schema te maken, kunnen we eenvoudig de structuur in het XML-document volgen en elk element definiëren zoals we het vinden. We beginnen met de standaard XML-declaratie gevolgd door het xs:schema-element dat een schema definieert:

<?xml version="1.0" encoding="UTF-8" ?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
...
</xs:schema>

In het bovenstaande schema gebruiken we de standaard naamruimte (xs), en de URI die aan deze naamruimte is gekoppeld, is de Schema-taaldefinitie, die de standaardwaarde heeft van http://www.w3.org/2001/XMLSchema.

Vervolgens moeten we het element "shiporder" definiëren. Dit element heeft een attribuut en het bevat andere elementen, daarom beschouwen we het als een complex type. De onderliggende elementen van het "shiporder" -element zijn omgeven door een xs:sequence-element dat een geordende reeks subelementen definieert:

<xs:element name="shiporder">
  <xs:complexType>
    <xs:sequence>
      ...
    </xs:sequence>
  </xs:complexType>
</xs:element>

Dan moeten we het element "bestelling" definiëren als een eenvoudig type (omdat het geen attributen of andere elementen bevat). Het type (xs:string) wordt voorafgegaan door het naamruimtevoorvoegsel dat is gekoppeld aan XML-schema dat een vooraf gedefinieerd schemagegevenstype aangeeft:

<xs:element name="orderperson" type="xs:string"/>

Vervolgens moeten we twee elementen definiëren die van het complexe type zijn: "shipto" en "item". We beginnen met het definiëren van het "shipto" element:

<xs:element name="shipto">
  <xs:complexType>
    <xs:sequence>
      <xs:element name="name" type="xs:string"/>
      <xs:element name="address" type="xs:string"/>
      <xs:element name="city" type="xs:string"/>
      <xs:element name="country" type="xs:string"/>
    </xs:sequence>
  </xs:complexType>
</xs:element>

Met schema's kunnen we het aantal mogelijke voorkomens voor een element definiëren met de attributen maxOccurs en minOccurs. maxOccurs specificeert het maximum aantal keren dat een element voorkomt en minOccurs specificeert het minimum aantal keren dat een element voorkomt. De standaardwaarde voor zowel maxOccurs als minOccurs is 1!

Nu kunnen we het element "item" definiëren. Dit element kan meerdere keren voorkomen in een "shiporder"-element. Dit wordt gespecificeerd door het maxOccurs attribuut van het "item" element in te stellen op "unbounded", wat betekent dat het "item" element zoveel kan voorkomen als de auteur wenst. Merk op dat het "note"-element optioneel is. We hebben dit gespecificeerd door het kenmerk minOccurs op nul te zetten:

<xs:element name="item" maxOccurs="unbounded">
  <xs:complexType>
    <xs:sequence>
      <xs:element name="title" type="xs:string"/>
      <xs:element name="note" type="xs:string" minOccurs="0"/>
      <xs:element name="quantity" type="xs:positiveInteger"/>
      <xs:element name="price" type="xs:decimal"/>
    </xs:sequence>
  </xs:complexType>
</xs:element>

We kunnen nu het attribuut van het "shiporder" element declareren. Aangezien dit een verplicht attribuut is, specificeren we use="required".

Opmerking: De attribuutdeclaraties moeten altijd als laatste komen:

<xs:attribute name="orderid" type="xs:string" use="required"/>

Hier is de volledige lijst van het schemabestand met de naam "shiporder.xsd":

<?xml version="1.0" encoding="UTF-8" ?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">

<xs:element name="shiporder">
  <xs:complexType>
    <xs:sequence>
      <xs:element name="orderperson" type="xs:string"/>
      <xs:element name="shipto">
        <xs:complexType>
          <xs:sequence>
            <xs:element name="name" type="xs:string"/>
            <xs:element name="address" type="xs:string"/>
            <xs:element name="city" type="xs:string"/>
            <xs:element name="country" type="xs:string"/>
          </xs:sequence>
        </xs:complexType>
      </xs:element>
      <xs:element name="item" maxOccurs="unbounded">
        <xs:complexType>
          <xs:sequence>
            <xs:element name="title" type="xs:string"/>
            <xs:element name="note" type="xs:string" minOccurs="0"/>
            <xs:element name="quantity" type="xs:positiveInteger"/>
            <xs:element name="price" type="xs:decimal"/>
          </xs:sequence>
        </xs:complexType>
      </xs:element>
    </xs:sequence>
    <xs:attribute name="orderid" type="xs:string" use="required"/>
  </xs:complexType>
</xs:element>

</xs:schema>

Verdeel het schema

De vorige ontwerpmethode is heel eenvoudig, maar kan moeilijk te lezen en te onderhouden zijn wanneer documenten complex zijn.

De volgende ontwerpmethode is gebaseerd op het eerst definiëren van alle elementen en attributen, en daarnaar verwijzen met het ref attribuut.

Hier is het nieuwe ontwerp van het schemabestand ("shiporder.xsd"):

<?xml version="1.0" encoding="UTF-8" ?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">

<!-- definition of simple elements -->
<xs:element name="orderperson" type="xs:string"/>
<xs:element name="name" type="xs:string"/>
<xs:element name="address" type="xs:string"/>
<xs:element name="city" type="xs:string"/>
<xs:element name="country" type="xs:string"/>
<xs:element name="title" type="xs:string"/>
<xs:element name="note" type="xs:string"/>
<xs:element name="quantity" type="xs:positiveInteger"/>
<xs:element name="price" type="xs:decimal"/>

<!-- definition of attributes -->
<xs:attribute name="orderid" type="xs:string"/>

<!-- definition of complex elements -->
<xs:element name="shipto">
  <xs:complexType>
    <xs:sequence>
      <xs:element ref="name"/>
      <xs:element ref="address"/>
      <xs:element ref="city"/>
      <xs:element ref="country"/>
    </xs:sequence>
  </xs:complexType>
</xs:element>

<xs:element name="item">
  <xs:complexType>
    <xs:sequence>
      <xs:element ref="title"/>
      <xs:element ref="note" minOccurs="0"/>
      <xs:element ref="quantity"/>
      <xs:element ref="price"/>
    </xs:sequence>
  </xs:complexType>
</xs:element>

<xs:element name="shiporder">
  <xs:complexType>
    <xs:sequence>
      <xs:element ref="orderperson"/>
      <xs:element ref="shipto"/>
      <xs:element ref="item" maxOccurs="unbounded"/>
    </xs:sequence>
    <xs:attribute ref="orderid" use="required"/>
  </xs:complexType>
</xs:element>

</xs:schema>

Benoemde typen gebruiken

De derde ontwerpmethode definieert klassen of typen, waardoor we elementdefinities kunnen hergebruiken. Dit wordt gedaan door de elementen simpleTypes en complexTypes een naam te geven en ze vervolgens aan te wijzen via het kenmerk type van het element.

Hier is het derde ontwerp van het schemabestand ("shiporder.xsd"):

<?xml version="1.0" encoding="UTF-8" ?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">

<xs:simpleType name="stringtype">
  <xs:restriction base="xs:string"/>
</xs:simpleType>

<xs:simpleType name="inttype">
  <xs:restriction base="xs:positiveInteger"/>
</xs:simpleType>

<xs:simpleType name="dectype">
  <xs:restriction base="xs:decimal"/>
</xs:simpleType>

<xs:simpleType name="orderidtype">
  <xs:restriction base="xs:string">
    <xs:pattern value="[0-9]{6}"/>
  </xs:restriction>
</xs:simpleType>

<xs:complexType name="shiptotype">
  <xs:sequence>
    <xs:element name="name" type="stringtype"/>
    <xs:element name="address" type="stringtype"/>
    <xs:element name="city" type="stringtype"/>
    <xs:element name="country" type="stringtype"/>
  </xs:sequence>
</xs:complexType>

<xs:complexType name="itemtype">
  <xs:sequence>
    <xs:element name="title" type="stringtype"/>
    <xs:element name="note" type="stringtype" minOccurs="0"/>
    <xs:element name="quantity" type="inttype"/>
    <xs:element name="price" type="dectype"/>
  </xs:sequence>
</xs:complexType>

<xs:complexType name="shipordertype">
  <xs:sequence>
    <xs:element name="orderperson" type="stringtype"/>
    <xs:element name="shipto" type="shiptotype"/>
    <xs:element name="item" maxOccurs="unbounded" type="itemtype"/>
  </xs:sequence>
  <xs:attribute name="orderid" type="orderidtype" use="required"/>
</xs:complexType>

<xs:element name="shiporder" type="shipordertype"/>

</xs:schema>

Het restrictie-element geeft aan dat het datatype is afgeleid van een W3C XML Schema namespace datatype. Het volgende fragment betekent dus dat de waarde van het element of attribuut een stringwaarde moet zijn:

<xs:restriction base="xs:string">

Het restrictie-element wordt vaker gebruikt om restricties op elementen toe te passen. Bekijk de volgende regels uit het bovenstaande schema:

<xs:simpleType name="orderidtype">
  <xs:restriction base="xs:string">
    <xs:pattern value="[0-9]{6}"/>
  </xs:restriction>
</xs:simpleType>

Dit geeft aan dat de waarde van het element of attribuut een string moet zijn, dat het precies zes tekens op een rij moet zijn en dat die tekens een getal van 0 tot 9 moeten zijn.