Schema
Et skjema fyller altså samme funksjon som en DTD. Vi kan validere XML-dokumenter mot skjemaer. La oss se på et lite eksempel med en DTD-fil og en Schema-fil.
Vi tar for oss en enkel bokliste. Starten på den er slik:
<?xml version="1.0" encoding="utf-8"?> <booklist> <book isbn="0-596-00292-0" pages="600"> <title>XML in a nutshell</title> <course>Programmering for web</course> <category>XML</category> <author>Elliot Rusty Harold and W. Scott Means</author> <publisher>OReilly</publisher> <year>2002</year> <comment>Ganske mer omfattende. God bok </comment> </book> <book isbn="0-201-76990-5" pages="200"> <title>The web wizards guide to XML</title> <course>Programmering for web</course> ....
En enkel DTD-fil for å validere filer av denne typen. Merk at vi kan bedre presisjonsnivået i denne DTD'en betraktelig, men hensikten med dette eksemplete er først og fremst Schema-formatet:
<?xml version="1.0" encoding="utf-8"?> <!ELEMENT author (#PCDATA)> <!ELEMENT book (title, course, category, author, publisher, year, comment)> <!ATTLIST book isbn CDATA #REQUIRED pages CDATA #REQUIRED > <!ELEMENT booklist (book+)> <!ELEMENT category (#PCDATA)> <!ELEMENT comment (#PCDATA)> <!ELEMENT course (#PCDATA)> <!ELEMENT publisher (#PCDATA)> <!ELEMENT title (#PCDATA)> <!ELEMENT year (#PCDATA)>
En Schema-fil med samme hensikt:
<?xml version="1.0" encoding="utf-8"?> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified"> <xs:element name="author" type="xs:string"/> <xs:element name="book"> <xs:complexType> <xs:sequence> <xs:element ref="title"/> <xs:element ref="course"/> <xs:element ref="category"/> <xs:element ref="author"/> <xs:element ref="publisher"/> <xs:element ref="year"/> <xs:element ref="comment"/> </xs:sequence> <xs:attribute name="isbn" use="required"> <xs:simpleType> <xs:restriction base="xs:string"/> </xs:simpleType> </xs:attribute> <xs:attribute name="pages" use="required"> <xs:simpleType> <xs:restriction base="xs:short"/> </xs:simpleType> </xs:attribute> </xs:complexType> </xs:element> <xs:element name="booklist"> <xs:complexType> <xs:sequence> <xs:element ref="book" maxOccurs="unbounded"/> </xs:sequence> </xs:complexType> </xs:element> <xs:element name="category"> <xs:simpleType> <xs:restriction base="xs:string"/> </xs:simpleType> </xs:element> <xs:element name="comment" type="xs:string"/> <xs:element name="course" type="xs:string"/> <xs:element name="publisher" type="xs:string"/> <xs:element name="title" type="xs:string"/> <xs:element name="year"> <xs:simpleType> <xs:restriction base="xs:short"/> </xs:simpleType> </xs:element> </xs:schema>
Vi ser for det første at Schema-fila har et ekte XML-format, og er således et "ekte medlem av XML-familien".
Vi ser at Schemaet inneholder struktur informasjon på samme måte som en DTD. F.eks.:
<xs:element name="book"> <xs:complexType> <xs:sequence> <xs:element ref="title"/> <xs:element ref="course"/> <xs:element ref="category"/> <xs:element ref="author"/> <xs:element ref="publisher"/> <xs:element ref="year"/> <xs:element ref="comment"/> </xs:sequence> ... </xs:complexType> </xs:element>
uttrykker det samme som vi finner i denne linja i DTD-fila:
<!ELEMENT book (title, course, category, author, publisher, year, comment)>
I begge formatene har vi mulighet for sette alternativer slik at vi ikke har en låst sekvens med obligatoriske elementer.
Selv om Schemaet ovenfor er svært enkelt, ser vi at vi har et langt bedre utbygd apparat for å angi hva slags dataformat vi forlanger på attributter og elementinnhold. F.eks. ser vi at sidetallet skal angis som et heltall:
<xs:attribute name="pages" use="required"> <xs:simpleType> <xs:restriction base="xs:short"/> </xs:simpleType> </xs:attribute>
Følgende linje, fra et annet Schema, angir at attributten location er obligatorisk og skal ha format av en URI:
<xs:attribute name="location" code="xs:anyURI" use="required"/>