290 likes | 398 Views
T3MM65 RAKENTEISET DOKUMENTIT Pläjäys 3. Heikki Hietala HAAGA Ammattikorkeakoulu Helsingin liiketalousinstituutti Kevät 2010. Mikä se skeema sitten on?. Skeema on XML-sääntöjen mukaan luotu XML-dokumentti, jolla kuvataan toista XML-dokumenttia. Simple as that.
E N D
T3MM65RAKENTEISET DOKUMENTITPläjäys 3 Heikki Hietala HAAGA Ammattikorkeakoulu Helsingin liiketalousinstituutti Kevät 2010
Mikä se skeema sitten on? • Skeema on XML-sääntöjen mukaan luotu XML-dokumentti, jolla kuvataan toista XML-dokumenttia. Simple as that. • Ero DTD:hen on siinä, että DTD ei ole XML-sääntöjen mukaista kieltä, mutta skeema on. • Näin ollen, jos osaat XML:ää, osaat tehdä skeemoja. • XML-skeematiedostojen oletustunniste on .xsd • Sen sisällä juurielementtinä on xs:schema <?xml version=”1.0” ?> <xs:schema xmlns:xs=”http://www.w3c.org/2001/XMLSchema”> <!--tähän väliin sitten ne määrittelyt--> </xs:schema> • On tapana pitää prefiksinä skeemassa joko xs tai xsd.
Julistetaanpa taas pikkuisen • Perusversiossa siis <xs:element name=”element-name” type=”element-type”> <!—content--!> </xs:element> • Jos ei ole sisältöä, riittää <xs:element name=”element-name” type=”element-type”/> • Eli palataksemme Blues Brotherseihin: <filmi>Blues Brothers</filmi> • julistetaan <xs:element name=”filmi” type=”string”/> • Huomannet tutun tietotyypin ’string’. Kyllä, niitä on muitakin.
Eli siis simple elements… <nimi>Blues Brothers</nimi> <ohjaaja>John Landis</ohjaaja> <kirjoittaja>Dan Aykroyd</kirjoittaja> <ensiesitys>1.1.1980</ensiesitys> <oscar>true<oscar> Menee skeemassa <xs:element name=”nimi” type=”xs:string”/> <xs:element name=”ohjaaja” type=”xs:string”/> <xs:element name=”kirjoittaja” type=”xs:string”/> <xs:element name=”ensiesitys” type=”xs:date”/> <xs:element name=”oscar” type=”xs:boolean”/>
Skeeman elementin attribuutit • Default • Jos XML ei sisällä arvoa elementille, default antaa sen • Käy vain string-tyyppisiin • Fixed • Elementin arvo, jota ei voi muuttaa • maxOccurs • Enimmäismäärä elementin esiintymiselle vanhempansa sisällä • minOccurs • Vähimmäismäärä elementin esiintymiselle • ref • Viittaus toisen elementin sisältöön
Kompleksiset elementit (teini-ikä?) <filmi> <nimi>Blues Brothers</nimi> <ohjaaja>John Landis</ohjaaja> <kirjoittaja>Dan Aykroyd</kirjoittaja> <ensiesitys>1.1.1980</ensiesitys> <oscar>tosi</oscar> </filmi> • …on kompleksi elementti • Siksi skeemankin pitää ensin määrittää ylätaso tai vanhempi, eli <xs:element name=”filmi” type=”xs:string”> • Ja määrittää että tämä on kompleksin rakenteen alku: <xs:complexType>
Kompleksi määritys jatkuu • Kompleksissa täytyy määrittää myös sekvenssi, ihan kuin DTD:ssäkin <xs:element name=”filmi” type=”xs:string”> <xs:complexType> <xs:sequence> <xs:element name=”nimi” type=”xs:string” /> <xs:element name=”ohjaaja” type=”xs:string” /> <xs:element name=”kirjoittaja” type=”xs:string” /> <xs:element name=”ensiesitys” type=”xs:date” /> <xs:element name=”oscar” type=”xs:boolean” /> </xs:sequence> </xs:complexType> </xs:element>
Attribuutit • Attribuuttien määritys vastaa yksinkertaista elementtiä. <filmi nimi=”Blues Brothers”> • on skeemassa <xs:element name=”filmi” type=”xs:string”> <xs:complexType> <xs:attribute name=”nimi” type=”xs:string” /> </xs:complexType> </xs:element> Entäs jos haluat saada tämän aikaan? <filmi nimi=”Blues Brothers”> <ohjaaja>John Landis</ohjaaja> <kirjoittaja>Dan Aykroyd</kirjoittaja> </filmi>
ComplexType ottaa molemmat • Attribuutti määritellään sekvenssin ulkopuolella. <xs:element name=”filmi” type=”xs:string”> <xs:complexType> <xs:sequence> <xs:element name=”ohjaaja” type=”xs:string” /> <xs:element name=”kirjoittaja” type=”xs:string” /> </xs:sequence> <xs:attribute name=”nimi” type=”xs:string” /> </xs:complexType> </xs:element>
Kiinteät arvot ja oletusarvot • Elementille voidaan määritellä attribuutit fixed ja default. <xs:element name=”kesto” type=”xs:integer” default=”90” /> • Määrittää että jos kestoa ei ole muutettu, se on 90 <xs:element name=”logfile” type=”xs:string” fixed=”syslog.txt” /> • Määrittää logfile-elementin arvoksi aina syslog.txt, ja sitä ei sitten XML:ssä voi muuttaa.
Esiintymiskerrat • Sekä xs:element että xs:attribute voidaan määrittää ottamaan tietty määrä esiintymiä. • Avainsanat ovat tällöin minOccurs ja maxOccurs • Esimerkki: vähintään yksi ohjaaja, mutta rajoittamaton määrä kirjoittajia: <xs:element name=”kesto” type=”xs:integer” default=”90” /> <xs:element name=”filmi” type=”xs:string”> <xs:complexType> <xs:sequence> <xs:element name=”ohjaaja” type=”xs:string” minOccurs=”1” /> <xs:element name=”kirjoittaja” type=”xs:string” maxOccurs=”unbounded” /> </xs:sequence> <xs:attribute name=”nimi” type=”xs:string” /> </xs:complexType> </xs:element>
Sequence ja All sekä Choice • Jos elementtien järjestyksellä on väliä, on käytettävä xs:sequence –määritystä • Jos sillä ei ole väliä, voidaan sanoa xs:all joka sallii kaikki lapsijärjestykset. • Lisäksi on xs:choice, joka mahdollistaa tasan yhden arvon esittämisen <xs:element name=”filmi” type=”xs:string”> <xs:complexType> <xs:choice> <xs:element name=”tv-julkaisu” type=”xs:string” /> <xs:element name=”dvd-julkaisu” type=”xs:string” /> </xs:choice> <xs:attribute name=”nimi” type=”xs:string” /> </xs:complexType> </xs:element>
Ryhmät • Jos jokin elementti toistuu usein, se voidaan määritellä kerran XSD:n alussa ryhmäksi. <filmi> <nimi>Blues Brothers</nimi> <ohjaaja> <titteli>Mr.<titteli> <etunimi>John</etunimi> <sukunimi>Landis</sukunimi> </ohjaaja> <kirjoittaja> <titteli>Mr.<titteli> <etunimi>Dan</etunimi> <sukunimi>Aykroyd</sukunimi> </kirjoittaja> <kirjoittaja> <titteli>Mr.<titteli> <etunimi>William</etunimi> <sukunimi>Shakespeare</sukunimi> </kirjoittaja> <ensiesitys>1.1.1980</ensiesitys> <oscar>tosi<oscar> </filmi>
Elementtiryhmän määrittely • Jos jokin elementti toistuu usein, se voidaan määritellä kerran XSD:n alussa ryhmäksi. <xs:group name=”kokonimi” /> <xs:sequence> <xs:element name=”titteli” type=”xs:string” /> <xs:element name=”etunimi” type=”xs:string” /> <xs:element name=”sukunimi” type=”xs:string” /> </xs:sequence> </xs:group> • Tätä ryhmää voidaan sitten käyttää kun määritellään elementtejä, joilla on sama rakenne • Esimerkissä on ohjaaja- ja kirjoittajaelementit
Elementtiryhmän käyttö <xs:group name=”kokonimi” /> <xs:sequence> <xs:element name=”titteli” type=”xs:string” /> <xs:element name=”etunimi” type=”xs:string” /> <xs:element name=”sukunimi” type=”xs:string” /> </xs:sequence> </xs:group> <xs:element name=”filmi” type=”xs:string” /> <xs:complexType> <xs:sequence> <xs:element name=”nimi” type=”xs:string” /> <xs:element name=”ohjaaja” type=”xs:string” /> <xs:complexType> <xs:group ref=”kokonimi” /> </xs:complexType> <xs:element name=”kirjoittaja” type=”xs:string” maxOccurs=”unbounded”> <xs:complexType> <xs:group ref=”kokonimi” /> </xs:complexType> </xs:sequence> </xs:complexType> </xs:element>
Attribuuttiryhmän määrittely • Jos jokin attribuutti toistuu usein, se voidaan määritellä kerran XSD:n alussa ryhmäksi. <xs:attributegroup name=”kokonimi” /> <xs:sequence> <xs:attribute name=”titteli” type=”xs:string” /> <xs:attribute name=”etunimi” type=”xs:string” /> <xs:attribute name=”sukunimi” type=”xs:string” /> </xs:sequence> </xs:attributegroup> • Tätä ryhmää voidaan sitten käyttää kun määritellään elementtejä, joilla on sama rakenne • Käyttö samalla tavalla kuin elementtiryhmässä <xs:attributegroup ref=”kokonimi”>
Arvojen rajaaminen • XML-tiedostoon vietävälle datalle voi asettaa rajoituksia. Rajoitus on ”restriction” eli rajoite • Elementti on aina <xs:restriction base=”perusta”> • <xs:rajoite arvo=”arvo”> • xs:enumeration: luettelo arvoista • xs:fractionDigits: desimaalien määrä • xs:length: merkkijonon tarkka pituus • xs:maxExclusive suurin mahdollinen arvo • xs:maxInclusive suurin mahd. arvo, arvo mukaan lukien • Xs:maxLength suurin mahd. pituus • Vastaavat minimiarvot • xs:Pattern merkkijakso, esim. ISBN • Xs:totalDigits suurin luvun merkkien määrä • Xs:whiteSpace määrittää näkymättömien merkkien käsittelyn
Luettelo arvoista </xs:element name=”ikaraja”> <xs:simpleType> <xs:restriction base=”xs:string”> <xs:enumeration value=”Sallittu” /> <xs:enumeration value=”K7” /> <xs:enumeration value=”K9” /> <xs:enumeration value=”K11” /> <xs:enumeration value=”K15” /> <xs:enumeration value=”K18” /> </xs:restriction> </xs:simpleType> </xs:element>
Pituusrajoitukset </xs:element name=”postinumero”> <xs:simpleType> <xs:restriction base=”xs:string”> <xs:length value=”5” /> <xs:pattern value=” [0-9] [0-9] [0-9] [0-9] [0-9] ” /> </xs:restriction> </xs:simpleType> </xs:element>
Mallirajoitukset </xs:element name=”matkapuhelinnumero”> <xs:simpleType> <xs:restriction base=”xs:string”> <xs:length value=”11” /> <xs:pattern value=”\d{3} - \d{7}” /> </xs:restriction> </xs:simpleType> </xs:element> <xs:pattern value=”[A-F]” /> ’A:sta F:ään, isot <xs:pattern value=”[ABCDEF]” /> ’sama <xs:pattern value=”[A-F][0-5][a-z]” /> ’esim. A5q <xs:pattern value=[A-Za-z][A-Za-z] /> ’Yhdysvaltain osavaltiot
Whitespace, eli näkymättömät merkit </xs:whiteSpace value=”Replace”> • Kaikki erikoismerkit korvataan yhdellä välilyönnillä </xs:whiteSpace value=”Preserve”> • Kaikki erikoismerkit pidetään sellaisina kuin ne syötettiin </xs:whiteSpace value=”Collapse”> • Kaikki erikoismerkit korvataan yhdellä välilyönnillä riippumatta siitä, montako niitä on
Tietotyypit • http://www.w3.org/TR/xmlschema-2/ • http://www.w3schools.com/schema/schema_elements_ref.asp • Nämä sisältävät kattavat listaukset kaikista tietotyypeistä.
Neljä mallia skeeman tekoon • Maatuskanukke • Luodaan skeema suoraan datan pohjalta, ikään kuin katsottaisiin peiliin • Viipalointi • Unohdetaan XML:n hierarkia ja tehdään malli, joka on tasainen, ei aaltorakenteinen • Sälekaihdin • Kahden edellisen yhdistelmä • Kierrätys • Käytetään mahdollisimman paljon kierrätettäviä rakenteita ja koostetaan skeema niistä
Hyvät puolet Helppolukuisin Yksinkertainen, koska vastaa XML:ää Kaik yhes koos (ei sisäkkäisiä riippuvuuksia) Huonot puolet Sisäkkäisen rakenteen ylläpito on hankalaa Skeeman julistusten kierrättäminen ei käy tehokysymykset Maatuskamalli
Hyvät puolet Mahdollistaa omien tyyppien ja dokumentin hierarkian käsittelyn erillään Kierrättää tyyppejä Sopii monimutkaisiin tehtäviin Kokeneet ohjelmoijat oppivat tämän helposti Huonot puolet Vaikealukuinen Epäintuitiivinen vasta-alkajan käyttöön Yksinkertaisissa järjestelmissä liian työläs Viipalemalli
Hyvät puolet Kierrätys Huonot puolet Vaikealukuinen Epäintuitiivinen vasta-alkajan käyttöön Yksinkertaisissa järjestelmissä liian työläs Sälekaihdin
Hyvät puolet Kierrätys Helppolukuiset skeemat Vähemmän sisäisiä riippuvuussuhteita Menetelmä vastaa objektiohjelmointia Huonot puolet Monimutkaisen rakenteen ylläpitäminen voi olla hankalaa. Kierrätysmalli
Namespacen ja skeeman sitominen XML-tiedostoon • Kaksi vaihtoehtoa, ilman namespacea ja namespacen kanssa. • Ilman<book isbn="0836217462" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="file:library.xsd"> • Kanssa <book isbn="0836217462" xmlns="http://example.org/ns/books/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation= "http://example.org/ns/books/ file:library.xsd">
Kaikki skeemasta • Datatyypit: • http://www.xml.com/pub/a/2000/11/29/schemas/dataref.html • Rakenteet • http://www.xml.com/pub/a/2000/11/29/schemas/structuresref.html