!

Dette materialet blir ikke lenger vedlikeholdt. Du vil finne oppdatert materiale på siden: http://borres.hiof.no/wep/

Validering
Schema
Børre Stenseth
XML > Validering >Schema

Schema

Hva
Introduksjon av skjemaer

Schema er funksjonelt sett å betrakte som et alternativ til Document Type Definition, se DTD . DTD har flere svakheter. Det har lite presisjonsnivå når det gjelder å angi hvilke typer av data som er tillatt og det har lite fleksibilitet når det gjelder alternative muligheter i en XML-fil.

Disse svakhetene har ført til at det har dukket opp forskjellige varianter av alternative formater for dokumentvalidering. I denne modulen holder vi oss til W3C's Schema.

Det ser ut til at Schemaer er i ferd med å overta som hovedverktøy i dokumentvalidering. Årsaken til dette er både at Schema tillater større presisjon og fleksibilitet og at det er enklere å transformere og sammenligne Schemaer enn DTDer.

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"/>
Referanser
  1. Schema (XML-validering) W3C www.w3.org/XML/Schema 14-03-2010
Du finner flere Schema-eksempler i modulen Noen datasett
Vedlikehold
Børre Stenseth, revidert juni 2012
( Velkommen ) XML > Validering >Schema ( DOM og SAX )