Jäsennys ja sarjallistaminen Tietorakenteen määrittely Hyvinmuodostettu / validi rakenne Rakenteen määrittely DTD XML-jäsentäjä (parser) on työkalu, joka pystyy muodostamaan puurakenteen tekstuaalisesta XMLesityksestä jäsentäjä tarkistaa XML-rakenteen perussäännöt, eli että dokumentti on hyvinmuodostunut (well-formed) (oikeamuotoinen): yksi juurielementti jokaisella ei tyhjällä elementillä alku- ja lopputunniste elementtien aito sisäkkäisyys attribuuttilausekkeiden muoto oikein nimet noudattavat xml-spesifikaatiota nämä yleistarkistukset voidaan tehdä XML:n yleisvaatimusten perusteella, ilman xml-kielen tarkempaa määritystä 1 2 Jäsennys ja sarjallistaminen Jäsennys ja sarjallistaminen Onko seuraava dokumentti hyvinmuodostunut? Jos ei niin miksi ei? <?xml version= 1.0"?> <p> Tästä alkaa ensimmäinen kappale... </p> <p>...ja tässä ollaan jo toisessa kappaleessa.<br> <font color=red>html</font>-selaimilla ei ole vaikeuksia näyttää tätä dokumenttia. <b>vai onko sittenkin?</b> </p> Validoiva jäsentäjä tarkistaa, että dokumentti on lisäksi annetun rakennemäärittelyn mukainen käyttää sallittuja elementtinimiä elementtien järjestys, sisäkkäisyys ja toistuvuus ovat määritysten mukaisia on käytetty sallittuja attribuutteja Edellyttää rakennemäärittelyä Sarjallistaja (serializer) on työkalu, joka tuottaa puuesityksestä tekstiesityksen 3 4 Rakennemäärittely Rakennemäärittely Rakennemäärittely (schema) on tietyn XMLkielen formaali määrittely Rakennemäärittely voidaan esittää rakennemäärittelykielellä (schema language) formaali kieli kielen rakenteen määrittelyyn toteutus: rakenteen analysoija, joka tarkistaa, että dokumentti on rakennemäärittelyn mukainen (valid) tarjolla useita rakennemäärittelykieliä (esim. DTD, XML Schema) dokumentti validi normalisoitu dokumentti rakenteen analysoija virheellinen rakennemäärittely virheilmoitukset 5 mahdollisesti muokattu, esim. lisätty oletusarvoja 6 Harri Laine 1
Rakennemäärittely Rakennemäärittelyjen tekniikkaa Formaalin rakennemäärittelyn hyötyjä Täsmällinen ja kattava määrittely helpottaa dokumenttien laatimista Rakennemäärittely voi ohjata dokumentin tuottamista Rakenteen mukaisuus tarkistettavissa yleiskäyttöisillä työkaluilla Rakennemäärittely vastaa ohjelmointikielen kielioppia relaatiotietokannan kaaviota Ohjelmointikielten kieliopit kuvataan yleensä BNF-muodossa SGML- ja XML-yhteyksissä käytetään omia määrittelytekniikoita. Näissä keskeisessä roolissa on säännöllisten lausekkeiden (regular expression) käyttö 7 8 Olkoon aakkosto, joka koostuu joukosta alkioita - tyypillisesti Unicode-merkkejä ja/tai elementtinimiä Aakkostoon perustuvat säännölliset lausekkeet noudattavat seuraavia sääntöjä jokainen :n alkio on säännöllinen lauseke jos ja ovat säännöllisiä lausekkeita niin?, *, +,, ja ( ) ovat myös säännöllisiä lausekkeita Säännöllinen lauseke joko hyväksyy tai hylkää aakkoston alkiojonon aakkoston alkio a hyväksyy vain itsensä eli alkion a? hyväksyy :n hyväksymän tai tyhjän jonon * hyväksyy 0 tai useampia :n hyväksymiä jonoja + hyväksyy yhden tai useampia :n hyväksymiä hyväksyy :n hyväksymän, jota seuraa :n hyväksymä (katenaatio) hyväksyy joko :n tai :n hyväksymän (valinta) ( )hyväksyy saman kuin 9 10 Operaattoreiden prioriteetti: *,?, + katenaatio valinta Sulkuja voi käyttää säätelemään operaattorien vaikutusta Esim. ab* c = (a(b*)) c Esimerkkejä: Lauseke (a(b*)) c hyväksyy joko yksittäisen merkin c tai kaikki merkkijonot, joiden alussa on a ja sitä seuraa 0 tai useampia b- merkkejä Lauseke 0 -?(1 2 3 4 5 6 7 8 9)(0 1 2 3 4 5 6 7 8 9)* Hyväksyy kelvolliset kokonaisluvut esim. 0, -200, mutta ei 007 tai -0 Olkoon aakkosto HTML:n elementtinimiä. Elementin table hyväksyttävä rakenne voidaan tällöin määritellä lausekkeella caption? ( col* colgroup* ) thead? tfoot? ( tbody+ tr+ ) 11 12 Harri Laine 2
on XMLstandardissa määritelty sisäänrakennettu rakennemäärittelykieli Yksinkertainen Ilmaisuvoimaltaan pienehkö DTD:llä esitetty rakennemäärittely voi olla erillisessä tiedostossa tai upotettuna osaksi dokumenttia Määrittely kytketään dokumenttiin DOCTYPEelementtinä. Ulkoinen määrittely: <!DOCTYPE juuri SYSTEM uri> tai <!DOCTYPE juuri PUBLIC tunniste uri> Sisäinen määrittely <!DOCTYPE juuri [... ]> juuri: juurielementin nimi uri: määrittelytiedoston URI (Universal Resource Identifier) tunniste: määrittelyn tunnus (jos sellainen on olemassa) : varsinainen määrittely 13 14 Esimerkkejä: <?xml version="1.1"?> <!DOCTYPE collection SYSTEM "http://www.brics.dk/ixwt/recipes.dtd"> <collection>... </collection> DTD -rakennemäärittely koostuu Elementtimäärittelyistä Attribuuttimäärittelyistä Nimettyjen kohteiden esittelyistä <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN "http://www.w3.org/tr/xhtml1/dtd/xhtml1- transitional.dtd"> <!DOCTYPE collection [... ]> 15 16 Elementtimäärittely on muotoa: <!ELEMENT element-name content-model > Sisällön kuvaus (content-model): EMPTY ANY mixed content: (#PCDATA e 1 e 2... e n )* element content: elementtinimiin perustuva säännöllinen lauseke, jossa aiemmin esitetystä poiketen peräkkäisyys (katenaatio) esitetään pilkulla (,) Esimerkki: <!ELEMENT table (caption?,(col* colgroup*),thead?, tfoot?,(tbody+ tr+)) > 17 18 Harri Laine 3
B F A C D Elementin A sisältömäärittelyssä määritellään vain seuraava taso puussa Sisältömallit EMPTY: ei mitään sisältöä (ei alisolmuja) ANY: ei mitään rajoitteita, kaikki elementit ja tekstitieto käyvät missä tahansa järjestyksessä. Elementit pitää kuitenkin määritellä. Mixed content: (#PCDATA e1 e2... en)* Tekstitieto ja luetellut elementit käyvät missä tahansa järjestyksessä, elementti voi esiintyä toistuvasti #PCDATA luettelossa ensimmäisenä - dokumentissa missä tahansa järjestyksessä Element content: säännöllinen lauseke määrittelee sallitut elementit, niiden järjestyksen ja toistot 19 20 <!ELEMENT collection (description,recipe*)> <!ELEMENT description (#PCDATA)> <!ELEMENT recipe (title,date,ingredient*,preparation, comment?,nutrition,related*)> <!ELEMENT title (#PCDATA)> <!ELEMENT date (#PCDATA)> <!ELEMENT ingredient (ingredient*,preparation)?> <!ELEMENT preparation (step*)> <!ELEMENT step (#PCDATA)> <!ELEMENT comment (#PCDATA)> <!ELEMENT nutrition EMPTY> <!ELEMENT related EMPTY> Sisällön määrittelyssä käytettävät säännölliset lauseet eivät saa olla moniselitteisiä (item?, item), jos jonossa yksi alkio niin kumpaa määrittelyelementtiä se vastaa <= (item, item?) ((nimi,työntekijä) (nimi, asiakas)) oikeaa vaihtoehtoa ei nähdä katsomatta eteenpäin <= (nimi,(työntekijä asiakas)) Katenaation ja valinnan presedenssi on määrittelemätön, joten on käytettävä sulkeita (title, fact fiction) ei käy vaan evaluointijärjetys tuotava esiin (title, (fact fiction)) 21 22 Jäsennettävää tekstitietoa sisältävä elementti ilmaistaan avainsanalla #PCDATA, merkki # avainsanan alussa osoittaa, että kyseessä 'varattu termi' (määrittelijä voisi periaatteessa määritellä myös elementin nimeltä PCDATA) Parametriviittaukset parametriviittauksia voidaan käyttää esim. kokoamaan yhteen usein toistuvia kielioppisääntöjen osia. Toistuvalle osalle annetaan nim. Viittausta voi käyttää, kun halutaan sisällyttää siihen liittyvä sisältö määrittelylausekkeeseen esim: <!ENTITY % usein "otsake, teksti, loppukommentti"> viittauksia <!ELEMENT kysely (tunnus, %usein;)> <!ELEMENT vastaus (vastaaja, kyselyviite, %usein;)> Jos sama elementti määritellään monta kertaa, niin ensimmäiseksi käsitelty määrittely jää voimaan Dokumenttiin upotettu määrittely käsitellään ennen ulkoisessa tiedostossa annettua 23 24 Harri Laine 4
Attribuutit määritellään attribuuttilistoina <!ATTLIST elementtinimi attribuuttimäärittelyt > Attribuuttimäärittely määrittelee elementtiin liittyvät attribuutti-arvo parit ja sisältää attribuutin nimen attribuutin tyypin tai arvojen joukon pakollisuusvaatimuksen mahdollisen oletusarvon Esim: <!ATTLIST country population NMTOKEN #IMPLIED coordinates NMTOKENS #IMPLIED language CDATA #REQUIRED continent (Europe America Asia ) "Europe"> 25 26 Tärkeimpiä attribuuttityyppejä CDATA: merkkijono (kielletyt merkit merkkiviittauksina) NMTOKEN: sana (nametoken), tyhjätilamerkit ja pilkku kiellettyjä XML 1.1:ssä, ei varattuja merkkejä (s1 sn): lueteltu sana, jokin annettuun sanaluetteloon kuuluvista sanoistanmtokens: tyhjätilamerkein eroteltu sanalista ID: elementin yksikäsitteinen tunnus, ei voi alkaa numerolla (yksikäsitteisyys ei rajoitu tyyppiin vaan on globaali vaatimus dokumentin sisällä) IDREF: vieraan dokumentin sisäisen elementin yksikäsitteinen tunnus IDREFS: tyhjätilamerkein eroteltu lista viitattavien elementtien tunnuksia Esimerkkejä: <!ATTLIST p align (left center right justify) IMPLIED> <!ATTLIST recipe id ID #IMPLIED> <!ATTLIST related ref IDREF #IMPLIED> 27 28 ID ja IDREF esimerkki IDREFS-esimerkki <!ELEMENT kuva EMPTY> <!ATTLIST kuva kuvaid ID #REQUIRED> <!ELEMENT taulukko EMPTY> <!ATTLIST taulukko taulukkoid ID #REQUIRED> <!ELEMENT viite EMPTY> <!ATTLIST viite kuvaidref IDREF #IMPLIED taulukkoidref IDREF #IMPLIED> <kuva kuvaid= kuva1 /> <kuva kuvaid= kuva2 /> <taulukko taulukkoid= t1 /> <p>tekstistä viitataan kuvaan <viite kuvaidref= kuva1 /> ja taulukkoon <viite taulukkoidref= t1 />, mutta voidaan viitata myös väärin <viite taulukkoidref= kuva2 />.</p> <!ELEMENT kuva EMPTY> <!ATTLIST kuva kuvaid ID #REQUIRED> <!ELEMENT viite EMPTY> <!ATTLIST viite kuvaidref IDREFS #REQUIRED> <kuva kuvaid= k1 /><kuva kuvaid= k2 /><kuva kuvaid= k3 /> <!-- valideja esimerkkejä --> <viite kuvaidref= k1 /> <viite kuvaidref= k2 k3 /> <viite kuvaidref= k1 k1 k1 /> <!-- voi olla samoja ID-arvoja --> <!-- nämä eivät ole valideja --> <viite kuvaidref= /> <viite kuvaidref= k1, k2 /> 29 30 Harri Laine 5
Attribuutin arvona voi olla viittaus ulkopuoliseen kohteeseen ENTITY tai viittausten joukko ENTITIES Tällaisia voisivat olla esimerkiksi kuvatiedostot <!NOTATION gif PUBLIC GIF > <!ENTITY BlueLine SYSTEM Blueline.gif NDATA gif> <!ELEMENT Separator EMPTY> <!ATTLIST Separator img ENTITY #REQUIRED> <Separator img= BlueLine /> Esiintymisvaatimus attribuuttimäärittelyssä #IMPLIED: valinnainen #REQUIRED: pakollinen "arvo" : valinnainen, puuttuessa oletetaan "arvo" #FIXED "arvo": valinnainen, puuttuessa oletetaan "arvo", annettuna vain "arvo" on sallittu 31 32 Attribuuttiarvojen normalisointi Kaikki erilaiset tyhjätilamerkit muutetaan välilyöntimerkeiksi (space) Viittaukset nimettyihin kohteisiin korvataan kohteen sisällöllä muista kuin CDATA tyyppisistä alkioista poistetaan alussa ja lopussa oleva tyhjätila peräkkäiset tyhjätilamerkit rajoitetaan yhteen jos tyhjätila attribuuttiarvoissa on tärkeää, pitää käyttää merkkiviittauksia Samaan elementtiin voi liittyä useita attribuuttilistojen määrittelyitä Nämä määrittelevät yhdessä kokonaisuuden Jos sama attribuutti määritellään useita kertoja, niin ensimmäisenä esiintyvää määrittelyä käytetään. 33 34 DTD esimerkki DTD esimerkki jatkuu <!ELEMENT collection (description,recipe*)> <!ELEMENT description (#PCDATA)> <!ELEMENT recipe (title,date,ingredient*,preparation, comment?,nutrition,related*)> <!ATTLIST recipe id ID #IMPLIED> <!ELEMENT title (#PCDATA)> <!ELEMENT date (#PCDATA)> <!ELEMENT ingredient (ingredient*,preparation)?> <!ATTLIST ingredient name CDATA #REQUIRED amount CDATA #IMPLIED unit CDATA #IMPLIED> <!ELEMENT preparation (step*)> <!ELEMENT step (#PCDATA)> <!ELEMENT comment (#PCDATA)> <!ELEMENT nutrition EMPTY> <!ATTLIST nutrition calories CDATA #REQUIRED carbohydrates CDATA #REQUIRED fat CDATA #REQUIRED protein CDATA #REQUIRED alcohol CDATA #IMPLIED> <!ELEMENT related EMPTY> <!ATTLIST related ref IDREF #REQUIRED> 35 36 Harri Laine 6
DTD:n rajoitteet XML-kielen määrittelystä DTD:n mahdollisuudet rajoittaa attribuuttien arvoja tai elementtien ovat sisältöä hyvin rajalliset. Tekstitietoa ei voi säädellä Attribuuttiarvojen rajaaminen on suppeaa Määritykset ovat yhteysriippumattomia Tekstitiedon ja elementtien yhdistelmiä ei voi kontrolloida Tunnisteisiin perustuva kytkentämekanismi on kovin yksinkertainen DTD ei noudata XML syntaksia DTD ei tue nimiavaruuksia 37 Rakennetta ei tehdä rakenteen itsensä vuoksi Mitä tiedoilla on tarkoitus tehdä vaikuttaa rakenteeseen Tieto organisoidaan käytön kannalta tarkoituksenmukaisella tavalla Tiedetäänkö aina mihin tietoja tulevaisuudessa käytetään? Ellei tiedetä tulee luonnollisen kohdelähtöinen määrittely tärkeämmäksi samoin varautuminen uusiin toimintavaatimuksiin vrt. relaatiotietokannan toimintariippumaton suunnittelu - XML:n monimutkaisemmille rakenteille ei ole vastaavaa 38 XML-kielen määrittelystä Käytä elementtejä jos tiedolle on tarpeen määritellä alirakenne jos tieto halutaan esittää muotoiltuna jos tietojen järjestyksellä on merkitystä Käytä attribuutteja jos ei tarvita alirakenteita arvoja pitää kyetä rajoittamaan järjestyksellä ei ole merkitystä tieto on metatietoa (kuinka käsitellään) Ei ihan noin suoraviivaista. Esimerkiksi relaatiotietokannan XML-näkymissä on eri tahoilta tarjolla sekä 'kokonaan attribuutteina' tai 'kokonaan elementteinä' lähestymistapoja. 39 Harri Laine 7