Schema
XSD
dtd
XML
Børre Stenseth

Validering

Hva

Velformethet er en generell egenskap ved XML-filer, uavhengig av vilket XML-språk vi snakker om. Vi kan alltid sjekke om en XML-fil er velformet basert de generelle reglene for hvordan elementer skal settes opp osv.

Validering av en XML-fil forutsetter at vi har et spesielt XML-språk og at vi har beskrevet dette språket.

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"/>
[1]
Referanser
  1. Schema Definition Language W3C www.w3.org/TR/xmlschema11-1/ 14-11-2014
  1. Validate an XML file xmlvalidation.com www.xmlvalidation.com/ 14-11-2014
  1. XSD/XML Schema Generator Freeformatter.com www.freeformatter.com/xsd-generator.html 14-11-2014