Johdanto XML-maailmaan 4 Johdanto XML-maailmaan Rakenteisia dokumentteja ei voi "ymmärtää" osamaatta niiden perustekniikkaa. Niinpä seuraavaksi kohdistamme huomion tekniikoihin. Rakenteisten dokumenttien yleisiin menetelmiin palaamme taas siten kun osaamme esim. (teknisesti) määritellä dokumenttityyppejä... Seuraavassa luodaan johdatteleva katsaus XMLmaailmaan, jatkossa yksittäisiin tekniikoihin pureudutaan tarkemmin. Tavoitteena on nyt oivaltaa metakielen perusidea ja nähdä metsä puilta potentiaalisesti tarpeellista osattavaa löytyy jo XML-perheestä todella paljon. Tällä kurssilla käsittely rajataan keskeisiin perustekniikoihin. 65
Johdanto XML-maailmaan 4.1 Välisoitto ATK onnistuu siis vain ottamalla tieto ja prosessit haltuun menetelmiin ja työkaluihin nojautuen Sopiva menetelmien valinta tarjoaa mahdollisuuksia soveltajalle mutta tietenkin myös asettaa reunaehtoja Ideaalitapauksessa toteutustekniikka valitaan vasta ongelman määrittelyn "jälkeen"...käytännössä ymmärrys eri menetelmien mahdollisuuksista ja rajoituksista toki ohjaa myös määrittelyä 66
Johdanto XML-maailmaan 4.2 Uusi merkintäkieli? XHTML soveltuu Web-sivujen julkaisuformaatiksi, mutta ei tarjoa kunnon välineitä mallintaa muuntyyppistä tietoa (vrt. musiikki.html) Myös "omien merkkausrakenteiden esittely HTMLkieleen" onnistuu esim. div- ja span-elementtien sekä class-attribuutin avulla Merkkauksesta tulee kuitenkin erittäin kömpelöä, ja käsittelijä joudutaan kuitenkin ohjelmoimaan itse (jopa julkaisusovelluksissa koska CSS ei mahdollista esim. elementtien uudelleenjärjestelyä eikä selain tietenkään ymmärrä itse keksittyjä classattribuutteja) "Rajoittuneisuus" ei kuitenkaan johdu merkkauksesta, vaan XHTMLdokumenttityypistä joka ei tietenkään taivu kaikkiin sovelluksiin (lue: ei sisällä merkkausrakennetta esim. cd-levyn tiedoille) 67
Johdanto XML-maailmaan 4.3 XHTML-merkkaus kierrätykseen Vaihdetaan siis sanasto...ja merkataan esim. seuraavasti (musiikki.alb): <music> <album artist="dire Straits" year="1978"> <name>dire Straits</name> <tracks> <track len="5m34s">sultans of swing</track> <track len="6m14s">in the gallery</track> </tracks> </album> <album artist="pet Shop Boys" year="1993"> <name>very</name> <tracks> <track len="3m55s">yesterday, When I Was Mad</track> </tracks> </album> </music> 68
Johdanto XML-maailmaan 4.4 Huomioita Merkkausrakenne on tuttu XHTML-kielestä, mutta käytössä on nyt music-sanasto (looginen rakenne!) Tiedot on nyt ilmeisestikin merkattu musiikkilevyjen käsitteiden näkökulmasta Se miten em. rakenteeseen päädyttiin on suunnitteluongelma -...oikeassa sovelluksessa ko. dokumentin tyyppi pitäisi tietenkin määritellä, esitellä (ja ohjeistaa sen käyttö) täsmällisesti <!DOCTYPE music SYSTEM "cd-music.dtd"> Mutta: kuka osaa yo. tietoa käsitellä, mikä ohjelma ymmärtää yo. rakenteen tiedot, kuka tietoa tuottaa, jne. - kannattaa siis suosia jo saatavilla olevia tyyppejä, jos mahdollista No, ainakin esitystavan määrittely onnistuu esim. CSS:n avulla (vrt. oheinen prosessointiohje), mutta tällä ei vielä pitkälle pötkitä: <?xml-stylesheet href="mystyle.css" type="text/css"?> 69
Johdanto XML-maailmaan 4.5 Miksi sama vanha merkkauskielioppi? Täysin uudentyyppisen merkintäkielen (myös uusi merkkauskielioppi) kehittäminen olisi toki myös mahdollista, mutta työlästä, eikä työhön kannata ryhtyä ilman hyviä perusteluita! Käytännössä pelkän merkintäkielen lisäksi kun tarvitaan yleensä "muutakin", esim. - editori, jolla dokumentteja voidaan tuottaa - sovellus(ohjelmia) tuotettujen dokumenttien hyödyntämiseen - sovelluksia, joissa tiedolla on käyttöä - yhteisö, joka ko. merkintäkielen suostuu ottamaan käyttöön Homma helpottuu huomattavasti, jos pyörää ei lähdetä keksimään uudestaan, vaan uusi merkintäkieli suunnitellaan jonkin standardoidun merkintäkielten kuvausjärjestelmän puitteissa (kokemukset!) -...merkkauskieliopin ja välineiden yhteensopivuus on XML:n perusta 70
Johdanto XML-maailmaan 4.6 No niin... XML - mikä se on? Extensible Markup Language (XML) 1.0 (Third Edition) on virallinen W3C suositus (ns. recommendation, 1. versio vuodelta 1998) XML määrittelee (teksti)dokumenttien loogisen ja fyysisen rakenteen, (merkkauskielioppi ja entiteetit) sekä DTD-määrityskielen tietyn (rajoitetun) elementtirakenteen omaavien, tietyntyyppisten dokumenttiluokkien kuvaamiseen XML 1.0 määrittelee keskeisesti XML-dokumenttien luokan, ts. sen, millaisia XML-dokumentit ovat ja miten niitä tulee käsitellä - XML-prosessori vs. XML-sovellus (ts. XML ~ rajapinta!) XML on SGML:n osajoukko (tästä seuraa ) Kaksi versiota: 1.0 (v. 1998) ja 1.1 (v. 2004); erot vähäisiä XML-sovelluksissa tarvitaan useita muitakin XML-perheen teknisiä suosituksia 71
Johdanto XML-maailmaan 4.7 XML-spesifikaation suunnittelukriteerit XML:ää kehittäneet XML Working Group (vanha SGML Editorial Review Board) ja XML Special Interest Group (vanha SGML Working Group) asettivat XML:n kehitystyölle seuraavia tavoitteita: - suoraviivainen käyttö Internetin yli - laaja sovellusalue (ei esim. laite- tai ohjelmistoriippuvuutta) - yhteensopivuus SGML:n kanssa - XML:ää käsittelevien ohjelmien kirjoittamisen helppous - vähän valinnaisia ominaisuuksia - dokumenttien luettavuus ja selkeys (myös ihmisten näkökulmasta) - määrityksen tulee valmistua nopeasti (työ alkoi toukokuussa 1996) - määrityksen suunnittelun on oltava tarkkaa ja huolellista - dokumenttien tekemisen helppous - minimalistiseen merkkauksen ei pyritä (esim. pitkät nimet ovat sallittuja) 72
Johdanto XML-maailmaan 4.8 XML-merkkaus pähkinänkuoressa (dok. esiintymäosa) <?xml version="1.0" encoding="iso-8859-1" standalone="no"?> <!DOCTYPE music SYSTEM "cd-music.dtd"> <!-- taustalla tyyppimääritys --> <?xml-stylesheet href="mystyle.css" type="text/css"?> <music xml:lang="en" xml:space="default"> <album artist="dire Straits" year="1978"> <name>dire Straits</name> <tracks> <track len="5m34s">sultans of swing</track> </tracks> <!-- lisäsin editorin kommentin --> <ed_note> Mercury Records. Dire Straits -- wrong time, wrong place? Note: Should comments be added to <![CDATA[<track>]]> elements as well? (&on;) </ed_note> <cover src="dd79.png" title="painting by Chuck Loyola" /> </album> </music> Ts. iso osa merkkauksesta tuli jo XHTML-esimerkeissä, nyt uutta oikeastaan enää merkkidatalohko 73
Johdanto XML-maailmaan 4.9 Tässäkö kaikki?! Ei (mutta "XML ~ ASCII of the 20th Century") Merkkaus on tärkeä mutta pieni askel kohti sovelluksia Todellinen pihvi ovat XML-merkkauksen ansiosta yhteensopivat ja standardoidut sovellukset; - dokumenttistandardit (esim. tyypit XHTML, SVG, SMIL, DocBook,... ja niiden sovellukset) - yhtenäinen perustekniikka (ohjelmointirajapinnat, salaus ja kryptausvälineet, kyselyt,...) - käsittelymenetelmät ja jo tehdyt välineet (muunnostyylit, dokumenttien koostaminen, kyselyt, prosessorit, selaimet,...)...joiden kehittämisessä ja soveltamisessa tarvitaan ilmeisesti muitakin kuin "merkkaustaitoja" Sovellusten kirjo on mahdollinen koska XML:n määrittelemä tietorakenne on yleiskäyttöinen (abstrakti) ja laajennettavissa (tähän palaamme vielä...) 74
Johdanto XML-maailmaan 4.10 Eräs XML-teknologiaperheen yleisjäsennys Standardoituja XMLpohjaisia teknologioita on todella paljon (puhumattakaan eri organisaatioiden omista XMLsovelluksista) Kärjistettynä: XMLmerkkaus tuo siis käyttöön paljon ko. rajapintaa tukevia teknologioita (sekä välineitä ja sisältöä) XHTML SVG SMIL EMMA XSL-FO XSLT RDFS, OWL RDF CSS XPath MathML CC/PP P3P XQuery VoiceXML WSDL WAI... XForms SOAP......... DOM Canonical Base Fragments Encryption Signature Inclusions Events XKMS XLink XPointer... XML 1.0/1.1 Namespaces 1/1.1 XML Schema HTTP Unicode URI 75
Johdanto XML-maailmaan 4.11 XML-perheen keskeisiä "standardeja" XML 1.0 (1.1) (*) - merkkauskielioppi, DTD-määrityskieli ja entiteetit (fyysinen rakenne) Namespaces (1.1) (*) - nimiavaruuden käsite (sanastojen yksikäsitteisyys) SAX & DOM (*) - ohjelmointirajapintoja (tapahtuma/mallipohjainen) XML Schema - DTD-kieltä ilmaisuvoimaisempi skeemakieli (sis. mm. std-tietotyypit) XSL (*) - erityisesti XSL-muunnoskieli XSLT (dokumenttiluokkien väliset muunnokset, esim. music xhtml, DocBook xsl-fo,...) (SAX = Simple API to XML, DOM = Document Object Model, XSL[T] = Extensible Stylesheet Language [Transformations]) 76
Johdanto XML-maailmaan 4.12 Mihin XML:ää voi käyttää? (1/2) Yksinkertaisimmillaan XML soveltuu HTML:n manttelinperijäksi, ts. kaikki, mitä HTML:llä voidaan tehdä, voidaan (periaatteessa) tehdä paremmin e01 e10 ID XML(-standardiperhee)llä e11 IDREF XML on kuitenkin yleisempi, ns. metakieli, ts. se ei ole rajoittunut vain XHTML-tyyppisten, ainoastaan esitettäväksi tarkoitettujen, jne. dokumenttien merkkaamiseen, vaan XML-dokumentteja voi käyttää miltei mihin tahansa (tietorakenne!) Abstraktin perusluonteensa ansiosta dokumentit voivat sisältää mitä tahansa tietoa mitä viittauksia sisältävällä puumaisella tietorakenteella voidaan ylipäänsä mallintaa, siis myös "tietueista koostuvia relaatioita" Suurin hyöty yleensä saavutetaan kun XML-tekniikat ja rakenteinen dokumentaatio nähdään (teknisenä ja [suunnittelu]menetelmällisenä) osana käsittelyaskelista koostuvia tiedonhallintaprosesseja e00 77
Johdanto XML-maailmaan 4.13 Mihin XML:ää voi käyttää? (2/2) Koska XML tarjoaa mahdollisuuden myös dokumenttien täsmälliseen tyypittämiseen, soveltuu XML lähtökohtaisesti - tiedon esitysmuodon standardointiin (XML-tekstiformaatit) - kommunikaation pohjaksi (XML-viestit) - tiedon arkistointitekniikaksi (...koska laite- ja ohjelmistoriippumatonta, periaatteessa helppoa käsitellä ja siten myös helppoa virkistää) XML-ohjelmien ja XML-prosessorirajapintojen ansiosta XML tarjoaa myös taloudellisen pohjan standardoitujen kehysten ja toisen tason metakielten määrittelyyn eri sovelluksiin (vrt. CC/PP, SOAP, RDF) -...ts. sovellushierarkia (tai palvelupino), perustana yksinkertainen XMLtietorakenne 78
Johdanto XML-maailmaan 4.14 Webin standardipinon yleisrakenne Saavutettavuus sovellusten sanastot yms. merkkausk. yms. Tiedonsiirto 79
Johdanto XML-maailmaan 4.15 Miksi ja mihin XML:ää ei pitäisi käyttää? XML:kään ei kannata ottaa perusteitta käyttöön teknologiavetoisesti, onhan olemassa - csv-tietorakenteita, taulukkolaskentaohjelmia, relaatiotietokantoja, hyviä propietarytekstiformaatteja, jne. XML-perustekniikan pulmina voidaan pitää esim. - tekstimuotoisuutta ja monisanaisuutta (verbose) (Binary XML tulossa...) - rajoittuneita merkkaus- ja tyyppimäärityskieliä (DTD), SGML-taustaa - käsittelyn "hitautta" (verrattuna optimoituihin relaatiotietokantoihin) Näissäkin tapauksissa XML voi kuitenkin tarjota luontevan tavan nimetä ja kehystää tietoa esim. tiedonsiirrossa tarvittavan rajapinta/liimakielen tavoin Osa (teknisistä) pulmista myös ratkeaa hyvällä suunnittelulla ja ottamalla käyttöön muitakin XML-standardiperheen määrityksiä ja kunnon työkaluja 80
Johdanto XML-maailmaan 4.16 Mitä XML:n käyttämiseen tarvitaan? (1/3) XML 1.0 on pohjimmiltaan varsin abstrakti ja yleiskäyttöinen määritys, joka kertoo, millaisia XML-dokumentit ovat (std-tietorakenne vs. sen sovellus) Koska tietorakenteen tulee olla kunnossa, tekstinkäsittelytyökalun rinnalla käytetään aina (validoivaa) XML-jäsennintä: - XML-dokumenttien merkkauksen tarkistaminen, so. onko dokumentti ns. hyvin muodostettu (well-formed) - XML-dokumenttien (rakenteen) validointi, so. dokumentin vahvistaminen tiettyyn dokumenttiluokkaan kuuluvaksi 81
Johdanto XML-maailmaan 4.17 Mitä XML:n käyttämiseen tarvitaan? (2/3) Tekstinkäsittelytyökalu ja jäsennin voidaan myös yhdistää, tuloksena... - graafinen esitys dokumentin puurakenteesta - XML-merkkauksen syntaksiväritys - elementtien menupohjainen valintatyökalu - tyylieditori ja dokumentin esikatselu,... Editoriin voidaan integroida muutakin, esim. - suunnitteluvälineitä, tyyppikirjastoja - tuki muille XML-standardiperheen välineille - yhteys tietokantajärjestelmään ja (yrityksen tai organisaation) muihin operatiivisiin järjestelmiin, objektieditoreita,... "XML-tuotantoympäristöjä ja -editoreita" ovat esim. - esim. FrameMaker, XML Spy, XMetaL, XRay,... - myös komentorivipohjaisia XML-jäsentimiä löytyy tavallisten tekstieditorien tueksi (esim. Xerces) 82
Johdanto XML-maailmaan 4.18 Mitä XML:n käyttämiseen tarvitaan? (3/3) Huom. Graafisten ympäristöjen käyttö on toisinaan "makuasia", toisinaan ei - vrt. "ohjelmointi" - mutta esim. tekniset kirjoittajat ("sisällöntuottajat") eivät ole kiinnostuneita merkkauksen tekniikasta vaan kirjoittamisesta! 83
Johdanto XML-maailmaan 4.19 Lopuksi: XML kulissien takaa vs. näyttämöllä Edellä kuvattiin lähinnä XML:ää kehittäjän näkökulmasta (tekniikkaa...) - loppukäyttäjän näkökulmasta XML on kuin mikä tahansa perustekniikka: - "taas uusia tiedostotyyppejä, jolle integroitu ohjelmistotuki" (vrt. Open Office) Rajatuissa sovelluksissa XML-syntaksi on käytännössä tarkoituksenmukaista piilottaa loppukäyttäjiltä, myös kirjoittajilta (vrt. HTML ja esim. Composerin käyttö) Mitä loppukäyttäjät sitten loppujen lopuksi tarvitsevat? - XML:ää hyödyntävän sovellusohjelman, pluginin tms., käyttöohjeineen Lue: loppukäyttäjän näkökulmasta rakenteisten dokumenttien ja esim. XML-tekniikoiden hyödyt ovat vain välillisiä - yhteensopivien ohjelmistojen runsaus, ominaisuudet, hinta (kehitystyön kustannukset), sovellusten hallittavuus ja virheettömyys,... 84
5 Merkkaus: XML protokollana XML on siis ns. metakieli, joka käytännössä voidaan tulkita tavaksi merkitä ja tyypittää rakenteisia dokumentteja. Kuten tunnettua, se tarjoaa puitteet esim. XHTML-kielen määrittelylle ja luo pohjaa esim. selainpohjaisille Websovelluksille. XML on kuitenkin ennen kaikkea standardimuotoinen tietorakenne tiedonsiirtoon tietokoneohjelmien välillä. Tästä syystä XMLdokumenttiluokka on määriteltävä tietorakenteena tarkasti. Yksityiskohtainen määrittely pyrkii varmistamaan että XML-perustekniikan varaan rakennettujen sovellusten määrittely on vakaalla pohjalla.... XML 10010010010010010011 85
5.1 Välisoitto XML 1.0 (1.1) on melko matalan tason protokolla... - määritys on yleiskäyttöinen (...pinomainen määritys) - ei suoraan osoita sovelluksia - määrityksen on oltava teknisesti tarkka - näkyy kenties "vain välineiden läpi" 86
5.2 XML-dokumentin lukeminen XML 1.0 (1.1) -spesifikaatio jakaa dokumenttien käsittelyn kaksitasoiseksi prosessiksi, jossa XML-prosessori (processor) lukee XML-dokumentin ja välittää tämän jäsennettynä sovellukselle (application) - XML-prosessori osaa lukea ja jäsentää merkkauskieliopin mukaisia dokumentteja (sis. DTD-tyyppimääritys) - sovellus hyödyntää jäsennettyä tietoa prosessorin toimittaman informaation perusteella (yleensä jäsennyspuun perusteella) <EX> This document is yet <IMG SRC="a"> another TEX My jäsennys EXA CON AUT Bill 0100100000 1010010110 1010100101 0110001010 1011001010 1001010010 XML-dokumentti XML-prosessori Sovellus Käyttö (osana "suurempaa" sovellusta) 87
5.3 Kyse on hyvin matalan tason määrittelystä XML 1.0 (1.1) on "protokollamainen" Erityisesti, XML 1.0 ei määrittele: - mihin sovellus käyttää XML-dokumentin tietoja - millainen ohjelmointirajapinta prosessorin ja sovelluksen välillä on (käytännössä yleensä kuitenkin "yleensä" SAX tai DOM) XML 1.0 (1.1) -spesifikaatio ei siis määrittele sovelluksen toimintaa käytännössä lainkaan (eikä siten XML-sovellusalueita) vaan keskittyy XML-prosessorin efektiivisen käyttäytymisen (ja virhetilanteiden, erityisesti peruuttamattomien virheiden) kuvailuun Siispä... - XML:n varaan voidaan rakentaa mitä tahansa sovelluksia jotka hyödyntävät elementti- ja attribuuttirakenteista tietoa - Perushyöty: matalan tason yhteensopivuus (merkkauskielioppi) 88
5.4 XML-dokumenttien merkkauksesta XML-dokumenttien merkkaus (markup) voi siis olla jotakin seuraavista: - prosessointiohje - dokumentin tyyppimäärittely - elementin alkutagi - elementin lopputagi - tyhjän elementin tagi - entiteettiviittaus - merkkiviittaus - kommentti - merkkidatalohko Kaikki muu tekstisisältö on merkkidataa Merkkaus tuli siis esiteltyä XHTML-dokumenttien esittelyn yhteydessä! - sama merkkauskielioppi on käytössä kaikissa XML-sovelluksissa: XHTML, SVG, DocBook, SOAP, RDF/XML,... ) e01 e00 e10 e11 ID IDREF 89
5.5 XML-dokumenttien jäsentäminen (1/2) Merkkauskieliopin täsmällisyydellä tavoitellaan tietenkin XML-dokumenttien ohjelmallisen käsittelyn yksikäsitteisyyttä (jäsennys onnistuu mekaanisesti) Dokumentin d.xml jäsennysyritys voi tuottaa seuraavat lopputulokset ok 1. d.xml sisältää merkkausvirheen d.xml ei ole XML-dokumentti 2. d.xml sisältää tyyppiesittelyn D muttei noudata sitä d.xml ei ole (tyyppi)validi XML-dokumentti #! (kuitenkin hyvin muodostettu XMLdokumentti jos kohta 1 läpäistiin) 3. d.xml sisältää tyyppiesittelyn D ja noudattaa sitä d.xml on validi XMLdokumenttia tyyppiä D 90
5.6... jäsentäminen (2/2) Huomautuksia - lopputulos 2 voi olla myös toivottu toisinaan dokumentin tyyppimäärittelyä käytetään vain entiteettien määrittelyyn - jäsennin ei kuitenkaan oletuksena ymmärrä dokumentin kirjoittajan tai sovelluksen tavoiteitta jäsentimen raportoimat virheet eivät välttämättä ole kovin kuvaavia (vrt. rxp-esim: 1nimi, tiku&taku, jne.) - XML kieltää "huonosti muodostettujen XML-dokumenttien" käsittelyn! Erilaisten XML-laajennusten myötä tulosten kirjo voi laajentua, erityisesti - noudattaako d.xml nimiavaruuksien kielioppia (joka lisää yhden kerroksen semantiikkaa XML-merkkauskieliopin tulkintaan) - noudattaako d.xml skeemaa D' 91
5.7 XML -dokumenttiluokan määritelty XML-dokumentin rakenne on siis määriteltävä täsmällisesti, muuten sen mekaaninen lukeminen ja jäsentäminen ("parsiminen") ei onnistu Väärinymmärrysten välttämiseksi (ja teknisen toteutustyön pohjaksi), XML 1.0 (1.1) on määritelty formaalin kielen tavoin (tuotto)sääntöinä (XML 1.1; 83 kpl) joista kaikki ko. kielen sanat (nyt siis hyvin muodostetut XMLdokumentit) voidaan johtaa; vrt. esim. (XML 1.0) [1] document ::= prolog element Misc* /*...*/ [39] element ::= EmptyElemTag STag content ETag [ WFC: Element Type Match ] [ VC: Element Valid ] XML 1.1:n ero 1.0:aan on lähinnä määrittelytekninen (1.1 lähinnä huomioi alla olevan Unicode-standardin kehityksen ja lisää uuden rivinvaihtomerkin.) 92
5.8 Kontekstivapaa kielioppi ja EBNF Kielioppi on määritelty ohjelmointikielistä tuttua BNF-notaatiota mukaillen Extended Backus Naur Form (EBNF) esittää ns. kontekstivapaan kielen kieliopin G = (N, T, N 0, P): - tuottosäännöt (P), välisymbolit (N), loppusymbolit (T), operaattorit, merkkiluokat ja kertojat - ensimmäisenä esiteltävä tuottosääntö N 0 sovitaan kieliopin aksioomaksi josta kaikki ko. formaalin kielen sanat johdetaan - kieli määritellään siten että sanoille löytyy yksikäsitteinen jäsennyspuu - EBNF-muotoiset kieliopit ovat helppolukuisia mutta eivät kovin ilmaisuvoimaisia (täsmennettävä esim. sanallisin lisäyksin) T ::= '(' T O T ')' N N ::= [1234567890]+ O ::= '+' '-' '*' '/' Nyt EBNF on siis vain väline ns. hyvin muodostettujen XML-dokumenttien määrittelyyn se ei tietenkään "näy" dokumenteissa kuin välillisesti 93
5.9 EBNF-sääntöjen rakenne (1/3) Kieliopin määrittely perustuu nyt literaaliviittauksiin, sulkujen käyttöön, operaattoreihin ja kertojiin Merkki ja merkkijonoviittaukset: - #xn (N on halutun merkin indeksi) - [a-za-z],[#xn-#xm] (lueteltu merkkiluokan merkki) - [^abc], [^#xn#xm] (jokin muu merkki kuin lueteltu) - "string", 'string' (vakiomerkkijono) Sulkujen käyttö: - (lauseke) (lausekkeiden ryhmittely esim. kertojien vaikutusalueen asettamiseksi) 94
5.10 EBNF-sääntöjen rakenne (2/3) Operaattorit: - A B (B seuraa A:ta) - A B (A tai B muttei molemmat) - A - B (A muttei B:tä) Kertojat: - A? (A esiintyy kerran tai ei ollenkaan) - A+ (A esiintyy yhden tai useamman kerran) - A* (A esiintyy yhden tai useamman kerran tai ei ollenkaan) Loput säännöllisistä lausekkeista tutut operaattorit ja kertojat voidaan konstruoida näistä, esim. "A{3,4}" on sama kuin "A A A A A A A" 95
5.11 EBNF-sääntöjen rakenne (3/3) Huom. XML-spesifikaatio esittelee lisäksi muutakin kielen määrittelyyn liittyvää notaatiota, erityisesti ns. rajoitteita (constraint): - /* */ (kommentti) - [ wfc: ] (well-formedness constraint) - [ vc: ] (validity constraint) Näitä tarvitaan teknisistä syistä, koska kontekstivapaa kielioppi (joka nyt siis kirjoitettu EBNF-notaatiota käyttäen) ei ole tarpeeksi vahva tiettyjen relaatioiden (järkevään esittämiseen), esim. - elementin alku- ja lopputagissa esiintyy sama nimi - elementin nimi on esitelty tyyppimäärittelyssä ja se esiintyy vanhemmassaan tämän tyyppiesittelyn mukaisesti 96
5.12 Merkitseviä asioita: nimet XML erottelee täsmällisesti merkistöihin, elementtien nimeämiseen ja attribuuttien arvoihin liittyviä termejä, näistä keskeisiä ovat: - nimi (name) - tunnistemerkkijono (name token) [4] NameChar ::= Letter Digit '.' '-' '_' ':' CombiningChar Extender [5] Name ::= (Letter '_' ':') (NameChar)* [7] Nmtoken ::= (NameChar)+ Muut em. tuottosäännöissä esiteltävät käsitteet määrittelevät (luettelevat) ne Unicode-indeksit (merkkiluokat), jotka vastaavat termejä "Letter", "Digit", "CombiningChar" ja "Extender", jne. (XML 1.0 vs. 1.1) Nimiä käytetään tyypillisesti elementtien nimeämiseen, tunnistemerkkijonoja taas esim. attribuuttien arvoalueen rajaamiseen Huom. XML varaa nimien prefixarvot [xx][mm][ll] omaan käyttöönsä - esim. "xml-element" ei siis ole laillinen itse keksityn elementin nimi 97
5.13 XML-dokumentin yleisrakenne XML-dokumentti jakautuu siis kahteen osaan: esittelyyn ja esiintymään [1] document ::= prolog element Misc* Esittely (prolog) - XML-versionumero, koodaustapa, riippumattomuusjulistus - dokumentin tyyppijulistus Esiintymä (instance, käytännössä juurielementti) - dokumentin sisältö (dokumentin juurientiteetti) mahdollisen tyyppikuvauksen rajoittaman loogisen rakenteen puitteissa Elementtien muodostama rakenne on hierarkkinen ja siten aidosti sisäkkäinen XML-dokumentti ei määritä omaa semantiikkaansa (merkitystä), vaan ainoastaan paljaan rakenteen, johon informaatio on "ripustettu" 98
5.14 XML-merkkauskieliopin määrittelystä (1/4) [22] prolog ::= XMLDecl? Misc* (doctypedecl Misc*)? [27] Misc ::= Comment PI S [23] XMLDecl ::= '<?xml' VersionInfo EncodingDecl? SDDecl? S? '?>' [24] VersionInfo ::= S 'version' Eq ("'" VersionNum "'" '"' VersionNum '"') [80] EncodingDecl ::= S 'encoding' Eq ('"' EncName '"' "'" EncName "'" ) [81] EncName ::= [A-Za-z] ([A-Za-z0-9._] '-')* /* Encoding name contains only Latin characters */ [32] SDDecl ::= S 'standalone' Eq (("'" ('yes' 'no') "'") ('"' ('yes' 'no') '"')) [ VC: Standalone Document Declaration ] Huomautuksia: - XML-esittely (tai julistus), dokumentin tyyppiesittely (tai julistus) - mikäli merkkikoodausta (encoding) ei ilmoiteta, oletetaan UTF-8 (prosessorit tukevan ainakin UTF-8 ja UTF-16, iso-8859-1 Suomessa!) 99
5.15 XML-merkkauskieliopin määrittelystä (2/4) Elementeillä on siis aina nimi (itse asiassa elementin tyypin nimi (generic identifier, GI)) ja saman nimen on tietenkin esiinnyttävä sekä elementin alkuettä lopputageissa: [39] element ::= EmptyElemTag STag content ETag [ WFC: Element Type Match ] [ VC: Element Valid ] [40] STag ::= '<' Name (S Attribute)* S? '>' [ WFC: Unique Att Spec ] [42] ETag ::= '</' Name S? '>' Tyhjän elementin tagi on hyvin samanlainen kuin elementin alkutagikin: [44] EmptyElemTag ::= '<' Name (S Attribute)* S? '/>' [ WFC: Unique Att Spec ] Tyhjän elementin saa siis kirjoittaa myös alku- ja lopputagien avulla (tällöin tagien väliin ei saa jäädä edes tyhjämerkkiä): 100
5.16 XML-merkkauskieliopin määrittelystä (3/4) Attribuuttien nimet määräytyvät kuten elementeillä, rakennekin on tuttu: [41] Attribute ::= Name Eq AttValue [ VC: Attribute Value Type ] [ WFC: No External Entity References ] [ WFC: No < in Attribute Values ] Attribuutin arvon sijoitusoperaattorina toimii tuttuun tapaan yhtäsuuruusmerkki [25] Eq ::= S? '=' S? XML-dokumenteissa elementeille voidaan pakottaa attribuutteja, antaa näille oletusarvoja sekä kiinnittää attribuuttien arvoalueita 101
5.17 XML-merkkauskieliopin määrittelystä (4/4) Entiteetti- ja merkkiviittaukset määritelty odotetusti (lt, gt, amp, apos, quot): [67] Reference ::= EntityRef CharRef [68] EntityRef ::= '&' Name ';' [ WFC: Entity Declared ] [ VC: Entity Declared ] [ WFC: Parsed Entity ] [ WFC: No Recursion ] [66] CharRef ::= '&#' [0-9]+ ';' '&#x' [0-9a-fA-F]+ ';' [ WFC: Legal Character ] Merkkidatalohkot, prosessointiohjeet ja kommentit samoin... [18] CDSect ::= CDStart CData CDEnd [19] CDStart ::= '<![CDATA[' [20] CData ::= (Char* - (Char* ']]>' Char*)) [21] CDEnd ::= ']]>' [16] PI ::= '<?' PITarget (S (Char* - (Char* '?>' Char*)))? '?>' [17] PITarget ::= Name - (('X' 'x') ('M' 'm') ('L' 'l')) [15] Comment ::= '<!--' ((Char - '-') ('-' (Char - '-')))* '-->' 102
5.18 Esimerkki: dokumentin looginen rakenne ESITTELY ESIINTYMÄ <?xml version="1.0" encoding="iso-8859-1"?> <!DOCTYPE example SYSTEM "hellow.dtd"> <example> <title>hei maailma!</title> <content> <text>ensimmäinen XML-dokumentti</text> <author>nn</author> </content><date/> </example> Merkkaus vastaa siis tiettyä loogista rakennetta Huomioita: - esittelyosan tyyppi määrää title "muotin" dokumentille - tyyppi saattaa pakottaa Hei attribuutteja joita ei ole merkattu esiintymäosaan text Ensimmä example content author NN date 103
5.19 XML-dokumentti on hyvin muodostettu XML-dokumentti on siis määritelmänsä ansiosta aina hyvin muodostettu (well-formed, WF); spesifikaation mukaan tekstidokumentti on (hyvin muodostettu) XML-dokumentti, jos 1) se voidaan kokonaisuutena johtaa XML-kieliopin documentaksioomasta, 2) se toteuttaa kaikki XML-kieliopin yhteydessä asetetut WFC-rajoitteet JA 3) jokainen tekstientiteetti, johon dokumentissa viitataan, on hyvin muodostettu XML-dokumentti (voi olla, ei ole pakko) lisäksi validi (valid), jos se esittelee tyyppinsä ja toteuttaa tyypin (VC-rajoitteet) - tyyppimäärittelystä voi siis olla hyötyä, vaikka validiuteen ei pyrittäisikään (entiteetit ja attribuuttien pakottaminen) Huomaa termit: esim. "väärin muodostettua" XML-dokumenttia ei siis ole olemassa 104
5.20 Huomautuksia jäsentimistä ja prosessoreista Käytännössä XML-dokumentin kirjoitusprosessissa tai tiedonsiirrossa saattaa tapahtua virhe, eikä lopputuloksena olekaan (WF) XML-dokumentti Tyypillinen XML-jäsennin toimii kuten ohjelmointikielen kääntäjä ja ilmoittaa havaitut syntaksivirheet - virheilmoitukset saadaan esim. tekstimuotoisena muodossa "virheen kuvaus, rivi, sarake, korjausehdotus" - paitsi ihmislukijalle, jäsentimen tulostus voidaan ohjata myös XMLsovellukselle (jäsennintä voidaan käyttää myös jonkin ohjelmointirajapinnan läpi) Erilaisia jäsentimiä on todella paljon (komentorivi, sulautettu, API, Web,...); kurssin kontekstissa hyviä ovat esim. Xerces ja RXP Huomaa että yksiä ja samoja jäsentimiä yms. prosessoreita kierrätetään eri ohjelmointiympäristöissä (esim. C-kielisen expatin käyttö PHP:ssä, Perlissä, Pythonissa jne.) 105