380 likes | 489 Views
T3MM65 RAKENTEISET DOKUMENTIT Pläjäys 2. Heikki Hietala HAAGA-HELIA Syksy 2009. What’s in a namespace?. Nimiavaruudessa on kyse siitä, että kaksi XML-sovellusta voi vahingossa käyttää samoja tunnisteita. Arabia tekee Teema-lautasia Canal+ markinoi satelliittilautasia
E N D
T3MM65RAKENTEISET DOKUMENTITPläjäys 2 Heikki Hietala HAAGA-HELIA Syksy 2009
What’s in a namespace? • Nimiavaruudessa on kyse siitä, että kaksi XML-sovellusta voi vahingossa käyttää samoja tunnisteita. • Arabia tekee Teema-lautasia • Canal+ markinoi satelliittilautasia • Jos nimiavaruuksista ei huolehdittaisi, Prisma tms. jälleenmyyjä saattaisi myydä lautasia sekaisin • Jumalaton pizzavati vs. Urheilukanavan näkyvyys posliinilautaselta vastaanotettuna?
Oletetaan että… • Arabia myy Teemaa: <lautanen> <malli>Teema</malli> <koko>22 cm</koko> <väri>valkoinen</väri> </lautanen> • Canal+ myy satelliittivastaanotinta: <lautanen> <malli>Samsung Outer Space</malli> <koko>222 cm</koko> <väri>harmaa</väri> </lautanen>
… ja sitten Prisma tilaa… <tilaus> <lautanen> <malli>Teema</malli> <koko>22 cm</koko> <väri>valkoinen</väri> </lautanen> <lautanen> <malli>Samsung Outer Space</malli> <koko>222 cm</koko> <väri>harmaa</väri> </lautanen> </tilaus>
Tilaus ei oikein onnistu • Yksikäsitteisyys ei ole enää voimassa • Tilauksen tavarat menevät sekaisin • Vain siinä tapauksessa, että yksikään jälleenmyyjä ei tilaa tavaraa molemmilta, voidaan tällaiset määrittelyt hyväksyä • Tilanteiden turvaksi on nimiavaruus, namespace.
Namespace tulee jostakin Namespace URIhttp://www.namespace-uri.com • Namespace URI (Uniform Resource Identifier) on useimmiten URL (Uniform Resource Locator) eli normaali HTTP-osoite • Koska URI on yksikäsitteinen, koko sen määräämä namespace on yksikäsitteinen • URIssa ei tarvitse oikeasti olla yhtään mitään. • Tiedoston käsittelyn aikana osoitteesta ei haeta mitään. • Silti on hyvä käyttää sellaista URIa joka on hallinnassa. Prefix nsp: nsp:element1 nsp:element2 nsp:element3
Takaisin Arabiaan • Sovitaanpa että namespace-määritys on xmlns:ara=”http://www.arabia.fi/2005/ns” • Eli siis koko XML: <ara:lautanen xmlns:ara=”http://www.arabia.fi/2005/ns” > <ara:malli>Teema</ara:malli> <ara:koko>22 cm</ara:koko> <ara:väri>valkoinen</ara:väri> </ara:lautanen>
Entä Canal+…? • Siellä namespace-määritys on ”xmlns:cpl=”http://www.canalplus.fi/xml” • Eli siis koko XML: <cpl:lautanen xmlns:cpl=”http://www.canalplus.fi/xml”> <cpl:malli>Teema</cpl:malli> <cpl:koko>22 cm</cpl:koko> <cpl:väri>valkoinen</cpl:väri> </cpl:lautanen>
… No nyt Prisma tilaa… <tilaus xmlns:cpl=”http://www.canalplus.fi/xml xmlns:ara=”http://www.arabia.fi/2005/ns”> <ara:lautanen> <ara:malli>Teema</ara:malli> <ara:koko>22 cm</ara:koko> <ara:väri>valkoinen</ara:väri> </ara:lautanen> <cpl:lautanen> <cpl:malli>Samsung Outer Space</cpl:malli> <cpl:koko>222 cm</cpl:koko> <cpl:väri>harmaa</cpl:väri> </cpl:lautanen> </tilaus> • Eli kaksi namespacea yhdessä tilauksessa on mahdollista, jopa pakollista jos on sekaantumisen vaara • Kun ne julistetaan juurielementissä, ne ovat käytössä kaikkialla
Default namespace • Onhan se tuskaa kirjoittaa se namespace prefix joka paikkaan, jos yhdellä pärjää • Siksi voi määrittää default namespacen juurielementtiin, josta se peritään lapsielementteihin <lautanen xmlns=”http://www.arabia.fi/xml”> <malli>Teema</malli> <koko>22 cm</koko> <väri>valkoinen</väri> <lautanen> • Default namespacessa ei ole prefixiä • Yksittäisen elementin voi silti määrittää kuuluvaksi johonkin toiseen namespaceen
Namespace ja attribuutit • Namespacet koskevat myös elementtien attribuutteja • Poikkeus on se, että default namespace ei koske attribuutteja • Jos siis haluaa olla tasan varma nimien yksikäsitteisyydestä, täytyy attribuuttien namespace määrittää myös: <cpl:malli cpl:vuosi=”1973”>Samsung Outer Space</cpl:malli>
Validointi • Validointi on tarpeen siksi, että ilman validointia ei voida sopia standardeista • Autojen varaosien jakelu sadan jälleenmyyjän kanssa olisi todella vaikeaa, jollei ensin sovita miten osista puhutaan • Validointiin tarvitaan joko DTD (Document Type Definition) tai skeema (XML schema) • Ne joko liitetään osaksi itse XML-tiedostoa tai sitten XML:ään liitetään tieto siitä, mistä validointimäärittelyt löytyvät
Esimerkki validointitarpeesta <tilaus> <id>1020</id> <nimi>Jakopään hihna</nimi> <hinta>110 e</hinta> </tilaus> • on periaatteessa sama validi rakenne kuin <tilaus id=”1020”> <nimi>Jakopään hihna</nimi> <hinta>110 e</hinta> </tilaus> • Mutta vaikka juurielementti on tilaus, ID menee väärään paikkaan, koska toisessa se on attribuutti ja toisessa elementti
Mitä validoinnissa tarkastetaan? • Sekvenssi • Missä järjestyksessä elementit esiintyvät • Keskinäiset suhteet • Vanhempi-lapsi ja sisäkkäisyyssuhteet • Tietotyypit • Elementeissä ja attribuuteissa • Validoinnin hoitaa parseri • Parseri ottaa validointitiedot ja vertaa varsinaista dataa validointiin
Skeeman ja DTD:n edut • DTD tai skeema on kuin rakennepiirustus toimivalle XML-dokumentille • Uusi käyttäjä pystyy heti luomaan oikeanlaisia tiedostoja • DTD ja skeema varmistavat, että kaikki XML-tiedoston käyttäjät ymmärtävät asiat samalla tavalla • DTD ja skeema varmistavat, että sovellukset saavat käyttöönsä toimivaa XML:ää
DTD XML Skeema • DTD:n puolesta • Laajalle levinnyt, paljon osaajia • Vanhatkin parserit tunnistavat • Käytössä monissa sovelluksissa kaikkialla • Helpohko oppia • DTD:tä vastaan • Epästandardi syntaksi (skeema on XML:ää) • Tietotyypit rajallisia • Nimiavaruuksia ei tueta • Perimys puuttuu, suljettu järjestelmä
DTD XML Skeema • Skeeman puolesta • XML-syntaksi • Rikkaat tietotyypit (… Bill Gates?) • Käyttäjän määrittelemät tietotyypit • Nimiavaruuksien tuki • Perimys tietotyypeissä • Skeemaa vastaan • Rajallinen parserituki • Hankalampi oppia
Kumpaa kannattaa käyttää? • Jos tarve on yksinkertainen, DTD riittää • Nopeampi kehittää ja helpoissa sovelluksissa aivan riittävä • Jos data on tekstipohjaista, DTD riittää • Jos haluat määritellä omia tietotyyppejä, skeema on ainoa vaihtoehto • Jos kehitysaika on rajallinen, DTD riittää • Mutta skeemalla on paremmat jatkokehitysmahdollisuudet
Sananen parsereista • Niitä on kahdenlaisia, validoivia ja ei-validoivia. • Lark, XP, HEX ja Expat eivät validoi • http://www.textuality.com/Lark/ • MSXML, Xerces, XMLBooster ja Larval validoivat • http://xml.apache.org/xerces-j/ • Skeemaa eivät kaikki vanhemmat parserit tunnista
DTD ei siis ole hyönteismyrkky • DTD on ensimmäinen XML:n validointiin tarkoitettu standardi • W3C:n spesifikaatio XML 1.0 esitteli DTD:n • Ei pidä sotkea Document Type Definitionia (DTD)Document Type Declarationiin (DTD). • DTD voi olla osa XML:ää tai ulkoinen tiedosto johon viitataan.
DTD:n osat • Kaikki DTD:n avainsanat AINA SUURAAKKOSIN • Kaikkien avainsanojen eteen aina !-merkki • Alkuun <!DOCTYPE <!DOCTYPE root-element SYSTEM ”filename.dtd”> • Viittaa filename.dtd-tiedostossa olevaan DTD:hen • Jos DTD on mukana XML:ssä, tehdään näin: <!DOCTYPE root-element [element-declarations]>
Funtsitaanpa elokuvaa <filmi nimi=”Blues Brothers”> <ohjaaja>John Landis</ohjaaja> <kirjoittaja>Dan Aykroyd</kirjoittaja> <vuosi>1980</vuosi> <kesto>133</kesto> <muuta/> </filmi> • Ihan siis normaalia XML:ää • Kun lisätään DTD, saadaan…
Ta-DAA! Eikun DTD! <?xml version=”1.0” encoding=”iso-8859-1”?> <!DOCTYPE filmi [ <!ELEMENT filmi (ohjaaja, kirjoittaja, vuosi, kesto, muuta)> <!ATTLIST filmi nimi #CDATA #REQUIRED> <!ELEMENT ohjaaja (#PCDATA)> <!ELEMENT kirjoittaja (#PCDATA)> <!ELEMENT vuosi (#PCDATA)> <!ELEMENT kesto (#PCDATA)> <!ELEMENT muuta EMPTY> ]> <filmi nimi=”Blues Brothers”> <ohjaaja>John Landis</ohjaaja> <kirjoittaja>Dan Aykroyd</kirjoittaja> <vuosi>1980</vuosi> <kesto>133<kesto> <muuta/> </filmi>
Elementtien julistaminen • Yleinen syntaksi on <!ELEMENT element-name (content-type)> • < ja > ovat välttämättömät • !ELEMENT on avainsana, joka kertoo julistuksen alkavan • Element-name on julistettava elementti • Content-type kertoo mitä elementti sisältää • Se voi kertoa myös, että elementillä on lapsia <!ELEMENT film (ohjaaja, kirjoittaja, vuosi, kesto, muuta)>
Tyhjät elementit • HTML:ssä on esim <BR> ja <HR>, jotka ovat tyhjiä elementtejä, vain attribuutteja sisältäviä • XML:ssä vastaavaan tarvitaan DTD-määre <!ELEMENT muuta EMPTY> • Ideana on käyttää tällaista tyhjää elementtiä vain olemaan olemassa, esim. <!ELEMENT oscar EMPTY> • voisi olemassaolollaan kertoa, onko filmi saanut Oscarin.
Merkkidataelementit • Kaksivaihtoehtoa - CDATA ja PCDATA • Jos data ei sisällä mitään erikoisuuksia, kuten <, >, =, voidaan käyttää Parsed Character Dataa. Silloin parseri yrittää tulkita kaiken elementin sisältämän datan. <!ELEMENT ohjaaja (#PCDATA)> <ohjaaja>John Landis</ohjaaja> • Kaikista erikoismerkeistä on tehtävä entiteettejä < > ja niin edelleen, muuten parseri käsittää että alkaa uusi tagi. • Jos taas haluaa liittää elementtiin esim. HTML-ohjauksia (typerä idea sinällään), on pakko sanoa <!ELEMENT ohjaaja (#CDATA)> <ohjaaja><b>John Landis</b></ohjaaja> • Nyt parseri sivuuttaa ohjaaja-elementin datan eikä tulkitse sitä
Yksilapsiset (kiinalaiset) elementit • Jos elementissä on vain yksi lapsielementti, syntaksi menee <!ELEMENT filmi (nimi)> --- <filmi> <nimi>Blues Brothers</nimi> </filmi> • Tämä DTD sanoo, että vain yksi nimi-elementti on luvallinen. Eli siis <filmi> <nimi>Blues Brothers</nimi> <nimi>Blues Brothers 2000</nimi> </filmi> • generoi virheen.
Monilapsiset elementit • DTD on sekventiaalinen systeemi. Elementtien julistamisjärjestyksellä on siis väliä. <!ELEMENT element-name (child-element-name1, child-element-name2, child-element-name3)> • DTD on sekventiaalinen systeemi. Elementtien julistamisjärjestyksellä on siis väliä. <!ELEMENT filmi (ohjaaja, kirjoittaja, vuosi, kesto, muuta)> • Jokaisella filmi-elementillä on mahdollista olla nämä kersat, tässä järjestyksessä. • Kun lapset on lueteltu, ne on myös julistettava.
Lasten julistaminen <!DOCTYPE filmi [ <!ELEMENT filmi (ohjaaja, kirjoittaja, vuosi, kesto,muuta)> <!ELEMENT ohjaaja (#PCDATA)> <!ELEMENT kirjoittaja (#PCDATA)> <!ELEMENT vuosi (#PCDATA)> <!ELEMENT kesto (#PCDATA)> <!ELEMENT muuta EMPTY> ]> • EMPTY-avainsanaa ei tarvitse laittaa sulkuihin • Muista, että DTD ei ole suositus vaan määräys. Lasten järjestystä ei voi XML:ssä vaihtaa ilman virheilmoituksia. • Eihän KELAkaan anna lapsilisää siten, että vaihtaa perheessä paikkaa pikkuveljen kanssa.
Kaksoset ja muut monikkoperheet • Puhutaanpa Dan Aykroydin filmeistä <filmi> <nimi>Blues Brothers</nimi> <nimi>Blues Brothers 2000</nimi> <nimi>Ghostbusters</nimi> <nimi>Ghostbusters 2</nimi> </filmi> • DTD:ssä tämä olisi <!ELEMENT element-name (child-element-name+) <!ELEMENT filmi (nimi+)
Jos et tiedä montako lasta on… <!ELEMENT element-name (child-element-name*)> • Mahdollistaa sen, että etukäteen ei tiedä montako lasta pitää olla (nolla, yksi, monta) • Kysymysmerkki on nolla tai yksi, mutta ei monta • Vaikkapa julkaisu videona ja DVD:nä: <!ELEMENT filmi (… julkaisu*) • Nyt voidaan sanoa <filmi nimi=”Blues Brothers”> <ohjaaja>John Landis</ohjaaja> <kirjoittaja>Dan Aykroyd</kirjoittaja> <vuosi>1980</vuosi> <kesto>133<kesto> <muuta/> <julkaisu>VHS</julkaisu> </filmi>
Voidaan myös sanoa <filmi nimi=”Blues Brothers”> <ohjaaja>John Landis</ohjaaja> <kirjoittaja>Dan Aykroyd</kirjoittaja> <vuosi>1980</vuosi> <kesto>133<kesto> <muuta/> </filmi> TAI <filmi nimi=”Blues Brothers”> <ohjaaja>John Landis</ohjaaja> <kirjoittaja>Dan Aykroyd</kirjoittaja> <vuosi>1980</vuosi> <kesto>133<kesto> <muuta/> <julkaisu>VHS</julkaisu> <julkaisu>DVD</julkaisu> <julkaisu>Betamax</julkaisu> </filmi>
Mutually exclusive children, eli riitaiset perheet • Joskus lapset eivät mahdu samaan autoon • XML:ssä on keino valita vain yksi muutamasta arvosta <!ELEMENT element-name (child-element-name | child-element-name | child-element-name)> <!ELEMENT julkaisumaa (sf|sv|no|dk)> <!ELEMENT sf EMPTY> <!ELEMENT sv EMPTY> <!ELEMENT no EMPTY> <!ELEMENT dk EMPTY>
Mutual exlusive käytössä • Mahdollinen: <julkaisu> <sv/> <julkaisu> • Ei mahdollinen: <julkaisu> <sv/> <sf/> <julkaisu>
Yhteiset säännöt kaikille lapsille <!ELEMENT element-name (child-element-name, child-element-name2, child-element-name3)*> • Antaa kaikille kolmelle lapselle tuntemattoman lukumäärän. • Samoin <!ELEMENT filmi ((ohjaaja, kirjoittaja)+, (vuosi, kesto)?, muuta)> • Määrittää yhden tai useamman ohjaajan, nolla tai yhden vuoden ja keston. Huomautus: • On olemassa myös avainsana ANY, mutta sen käyttäminen nollaa DTD:n antamat edut • Älä siis määritä <!ELEMENT element-name ANY> • ANYn ainoa hyvä puoli on ettei parseri ronki sitä
Attribuuttien julistaminen • Attribuutitkin on julistettava: <filmi nimi=”Natsat” id=”102”> • DTD: <!ATTLIST element-name attribute-name attribute-type default-value> • Jos haluat sanoa, että filmi-elementin nimi-attribuutti on pakollinen: <!ATTLIST filmi nimi CDATA #REQUIRED> • Useita attribuutteja: <!ATTLIST filmi nimi CDATA #REQUIRED studio CDATA #REQUIRED jakelija CDATA>
Attribuuttien tyypit • CDATA Merkkidataa ilman koodauksia • Enumerated luettelo arvoista • ID yksilöivä nimi • IDREF tiedostossa oleva viittausnimi • Käytetään viittausten luomiseen dokumenttien välillä • IDREFS viittaus tyyliin yksi-moneen • ENTITY ennalta määrätty entiteetti • DTD:ssä julistettu, esim. lyhenteen avaava teksti • ENTITIES useampia entiteettejä • NMTOKEN Jokin XML-nimi • NMTOKENS Useita nimiä
Attribuuttien käyttö • Normaali tapaus <!ATTLIST filmi nimi CDATA #REQUIRED> • Ei siis voi ottaa arvoa <i>Natsat</i> • Luetteloidut arvot <!ATTLIST julkaisu kuvasuhde (1.33 | 1.85 | 2.35) REQUIRED#> <julkaisu kuvasuhde=”1.33”> on oikein <julkaisu kuvasuhde=”1.33:1”> ei ole oikein