Validering
Det er to muligheter for å lage slike språkbeskrivelser:
- Document Type definition (DTD). Dette er den tradisjonelle formen som nok er på vei ut, men som fortsatt brukes på eldre HTML-versjoner.
- Schema beskrivelser i XSD(Schema Definition Language).Dette er en beskrivelsesform som er mer presis enn DTD. Schema har dessuten den egenskapen at de i seg selv er prosesserbare XML-filer og derfor kan behandles med XML-verktøy. Merk at det er flere Schema-versjoner i bruk. Jeg forholder meg til Schema fra W3C [1] .
Det finnes en rekke verktøy tilgjenglig on-line både for å sjekke XML-filer og for å lage forslag til XSD-filer(Schema) basert på XML. F.eks. xmlvalidation.com [2] og Freeformatter.com [3] . (jeg har ikke tested disse veldig nøye).
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"/>