XML-datan kysely Topi Sarkkinen Seminaarityö Helsinki 18.3.2015 HELSINGIN YLIOPISTO Tietojenkäsittelytieteen laitos
HELSINGIN YLIOPISTO HELSINGFORS UNIVERSITET UNIVERSITY OF HELSINKI Tiedekunta Fakultet Faculty Laitos Institution Department Matemaattis-luonnontieteellinen tiedekunta Tekijä Författare Author Tietojenkäsittelytieteen laitos Topi Sarkkinen Työn nimi Arbetets titel Title XML-datan kysely Oppiaine Läroämne Subject Tietojenkäsittelytiede Työn laji Arbetets art Level Seminaarityö Tiivistelmä Referat Abstract Aika Datum Date 18.3.2015 Sivumäärä Sidoantal Number of pages 10 XML on suosittu metakieli tiedon esittämiseen ja siirtoon. Tässä työssä käsitellään kolmea kenties tärkeintä XML-datan kyselyteknologiaa: XPathia, XQuerya ja XSLT:tä. Avainsanat Nyckelord Keywords xml, xpath, xquery, xslt Säilytyspaikka Förvaringställe Where deposited Muita tietoja Övriga uppgifter Additional information
Sisältö 1 Johdanto 1 2 XPath 2 2.1 Elementtien valinta...3 2.1.1 Akselimäärittely...3 2.1.2 Solmutesti...3 2.1.3 Predikaatti...3 2.2 Funktiot ja operaattorit...4 3 XQuery 5 3.1 FLWOR...5 3.2 Ehtolauseet...7 3.3 Funktiot...8 4 XSLT 8 4.1 Tiedostojen muunto...8 4.2 Syntaksi...9 5 Yhteenveto 9 Lähteet 11
1 1 Johdanto XML eli Extensible Markup Language on World Wide Web Consortiumin (W3C) kehittämä merkintäkieli [BPS98]. XML on eräänlainen metakieli, jolla voidaan määritellä myös muita kieliä. Se on luettavaa niin ihmisille kuin tietokoneillekin. XMLdokumenttien rakenne auttaa suurten tietomäärien jäsentämistä selkeämmäksi. XML:n spesifikaatiot ovat avoimesti saatavilla ja vapaasti käytettävissä [BPS98]. Viralliset spesifikaatiot määrittelee W3C, mutta avoimen luonteensa ansiosta myös useita muunnelmia ja laajennoksia on kehitetty. XML:ää käytetään yleisesti tiedon esittämiseen, dokumenttien tallentamiseen ja tiedonsiirtoon järjestelmien välillä, erityisesti internetin kautta. Useat suositut webpalveluiden viestinvälityspalvelut, kuten SOAP, pohjautuvat XML:ään sen laajan tuen ansiosta. XML-dokumentti on sisällöltään tekstiä, joka on yleensä oletuksena W3C:n suosituksen mukaisesti UTF-muotoista [BPS98]. Dokumentti koostuu elementeistä ja niitä tarkentavista attribuuteista. Elementit luovat dokumentille rakenteen. Ne muodostuvat alku- ja loppumerkeistä, joita kutsutaan tageiksi. Kuvassa 1 on yksinkertainen esimerkki XML-dokumentista. <?xml version="1.0" encoding="utf-8" standalone="yes"?> <tietojenkäsittelytiede> <kurssit> <kurssi id="123">ohjelmoinnin perusteet</kurssi> <kurssi id="432">ohjelmoinnin jatkokurssi</kurssi> <kurssi id="876">tietokantojen perusteet</kurssi> <kurssi id="967">rinnakkaisohjelmointi</kurssi> </kurssit> <henkilöstö> <henkilö tyyppi="opettaja">olli Opettaja</henkilö> <henkilö tyyppi="hallinto">ella Esimies</henkilö> <henkilö tyyppi="hallinto">jorma Johtaja</henkilö> </henkilöstö> </tietojenkäsittelytiede> Kuva 1: Esimerkki XML-dokumentista. Esimerkiksi kuvassa 1 jokainen henkilö on <henkilö> -elementin sisällä. Elementillä on
2 myös attribuutti tyyppi, joka kertoo henkilön aseman. Elementtejä voi olla sisäkkäin ja peräkkäin rajattomasti. XML:ää on kritisoitu sen monimutkaisuudesta ja paljon tilaa vievästä tyylistä, erityisesti liittyen tiedonvälitykseen järjestelmien välillä. Nykyään melko suosittuja vaihtoehtoja jäsennellyn datan lähettämiseen tietoverkoissa ovat muun muassa JSON ja YAML, joissa tieto mahdutetaan pienempään tilaan. XML on silti nykyäänkin erittäin relevantti teknologia. XML-muotoisen datan kyselyyn ja käsittelyyn on useita tekniikoita ja teknologioita, mutta tässä työssä keskitytään kolmeen melko keskeiseen teknologiaan: XPath, XQuery ja XSLT. XPath (XML Path Language) on W3C:n määrittelemä yksinkertainen kieli XMLdokumenttien osien löytämiseen ja valitsemiseen [ClD99]. Useat laajemmat kyselytoteutukset pohjautuvat XPathiin. Sitä käsitellään kappaleessa 2. XQuery on XPathia voimakkaampi SQL:ään verrattavissa oleva funktionaalinen kyselykieli XML-datan käsittelyyn [BCF02]. Myös sen taustalla on W3C. XQuerya käsitellään kappaleessa 3. XSLT (Extensible Stylesheet Language Transformations) on taas XML-dokumenttien muuntamiseen kehitetty merkintäkieli [Cla99]. Sen avulla XML-dokumentteja voi muuntaa muiksi dokumenteiksi, esimerkiksi HTML-sivuksi. XSLT:tä käsitellään kappaleessa 4. 2 XPath XPath eli XML Path Language on kyselykieli XML-dokumentin osien löytämiseen ja valitsemiseen [ClD99]. Se on W3C:n vuonna 1999 luoma ja suosittelema teknologia (W3C Recommendation 1999). Pelkän XML-dokumentin solmujen valitsemisen lisäksi XPathilla voi tehdä erilaisia operaatioita valituille solmuille. Käytettävänä on muun muassa aritmeettisia operaatioita ja merkkijonofunktioita. XPath on melko yksinkertainen kieli, mutta se toimii pohjana useille muille XMLkyselyteknologioille, kuten XQuerylle [BCF02].
3 2.1 Elementtien valinta XPath perustuu XML-dokumentin puumaiseen rakenteeseen, jota pitkin voi liikkua ja valita solmuja annettujen ehtojen mukaisesti [ClD99]. XPath-polkulausekkeessa määritellään eri askeleet, joilla päästään solmusta joko yhteen tai useampaan muuhun solmuun. Polkulauseke koostuu kolmesta osasta: akselimäärittelystä, solmutestistä ja valinnaisesta predikaatista eli ehtolauseesta. Lausekkeen rakenne jäljittelee URI-polkujen (Uniform Resource Identifier) muotoa. Lausekkeille on olemassa kaksi erilaista merkintätapaa: täysi syntaksi ja lyhennetty syntaksi. Tässä työssä keskitytään yleisempään lyhennettyyn syntaksiin. 2.1.1 Akselimäärittely Akselimäärittely kertoo liikkumissuunnan XML-dokumentin puussa, eli valitaanko esimerkiksi pelkästään nykyisen solmun lapsia, jälkeläisiä tai edeltäjiä. Oletuksena valitaan nykyisen solmun lapsia, jolloin sitä ei tarvitse erikseen määritellä lyhennettyä syntaksia käytettäessä. Lapsien valinnan lisäksi yleisiä akselimäärittelyjä ovat jälkeläiset (//) ja attribuutti (@). Esimerkiksi lauseke /A/B valitsee kaikki elementtien A lapset B, mutta lauseke /A//B valitsee elementtien A kaikki jälkeläiset B, eli siis lapset ja muut syvemmältä löytyvät jälkeläiset. 2.1.2 Solmutesti Solmutesti määrittelee mitä dokumentista valitaan ja koostuu usein vain kohteen nimestä. Esimerkissä /A/B solmutestejä ovat siis elementtien nimet A ja B, jotka kertovat valittavat solmut. 2.1.3 Predikaatti Predikaatit eli ehtolauseet määrittävät löytyneille elementeille ehtoja, jotka niiden tulee täyttää tullakseen valituiksi. Sillä siis voidaan suodattaa mukaan vain halutut ehdot täyttävät elementit. Predikaatit eivät ole pakollinen osa XPath-lauseketta, mutta niitä voi myös olla useita missä tahansa lausekkeen askeleessa. Predikaatit määritellään askeleen lopussa hakasuluilla. Esimerkiksi lauseke
/A/B[@nimi='Topi' valitsee kaikki elementti A:n lapset B, joilla on attribuutti nimi ja sen arvona Topi. Huomaa, että määrittely @ on yllä mainittu akselimäärittely, joka tarkoittaa attribuuttia. Kuva 2 havainnollistaa XPath-lausekkeen toimintaa yksinkertaisella esimerkillä. Siinä valitaan tietojenkäsittelytieteen henkilöstöstä henkilöt, joilla on attribuutti tyyppi arvolla hallinto. XML-dokumentti: <tietojenkäsittelytiede> <kurssit> <kurssi id="123">ohjelmoinnin perusteet</kurssi> <kurssi id="432">ohjelmoinnin jatkokurssi</kurssi> <kurssi id="876">tietokantojen perusteet</kurssi> <kurssi id="967">rinnakkaisohjelmointi</kurssi> </kurssit> <henkilöstö> <henkilö tyyppi="opettaja">olli Opettaja</henkilö> <henkilö tyyppi="hallinto">ella Esimies</henkilö> <henkilö tyyppi="hallinto">jorma Johtaja</henkilö> </henkilöstö> </tietojenkäsittelytiede> XPath-lauseke: /tietojenkäsittelytiede/henkilöstö/henkilö[@tyyppi="hallinto"] Tulos: <henkilö tyyppi="hallinto">ella Esimies</henkilö> <henkilö tyyppi="hallinto">jorma Johtaja</henkilö> Kuva 2: Esimerkki XPath-hausta. 4 2.2 Funktiot ja operaattorit XML-dokumentin osien valitsemisen lisäksi XPathilla voi niille myös tehdä erilaisia operaatioita [ClD99]. XPathissa XML-dokumentin katsotaan rakentuvan neljästä eri tietotyypistä: solmujoukko, merkkijono, numero ja totuusarvo. Näitä tietotyyppejä voi käsitellä eri tavoin. Numeroita voi käsitellä aritmeettisilla operaattoreilla +, -, *, div (jakolasku) ja mod (modulo). Operaattorien lisäksi numeroiden manipuloimiseen on apuna joukko funktioita, muun muassa sum summan laskemiseen ja round pyöristämiseen.
5 Merkkijonojen käsittelyyn voi käyttää myös useita funktioita. Merkkijonoja voi esimerkiksi yhdistää concat-funktiolla tai merkkijonosta voi valita tietyn osan substring-funktiolla. Totuusarvoista voi tarkistaa niiden olevan joko true tai false ja käyttää tätä vertailuissa tai ehdoissa. Solmujoukoista voi muun muassa laskea solmujen määrän count-funktion avulla. 3 XQuery XQuery (XML Query) on kappaleessa 2 esitellyn XPathin tapaan W3C:n suunnittelema kysely- ja ohjelmointikieli jäsennellyn datan kyselyyn ja muuntamiseen [BCF02]. XQueryn käyttö ei rajoitu pelkästään XML-dokumentteihin, vaan sitä voi käyttää myös esimerkiksi JSON-datan tai HTML-sivujen kanssa. XQuery rakentuu osittain XPath-lausekkeiden pohjalle, mutta on huomattavasti sitä laajempi ja voimakkaampi kieli [MeB06]. XQuerylla voi tehdä myös SQL-tyyppisiä kyselyitä, jolloin tuloksena on se, että XML-dokumentteja voidaan tavallaan käsitellä kuten tietokantaa. 3.1 FLWOR XQuery käyttää XPath-lausekkeita XML-dokumentin navigoimiseen [BCF02]. Siinä voi siis käyttää esimerkiksi XPathin ehtolauseita navigoinnin apuna, mutta XQuery ei kuitenkaan rajoitu pelkästään niihin. XPath-lausekkeiden lisäksi hakua voi tehostaa niin kutsutulla FLWOR-lausekkeella, joka tarkoittaa SQL-henkistä kyselyä ja sen eri osien rakenteita (for, let, where, order by, return). Onkin osuvaa sanoa XQueryn olevan XML-dokumenteille kuten SQL on tietokannoille. For-määrittely kertoo mitä dokumenttia tai kokoelmaa kysely koskee ja määrittelee XPathia käyttäen mahdolliset rajaukset hakuun. Se myös asettaa löydetyt elementit määriteltyyn muuttujaan ja aloittaa niiden iteroimisen. Lauseke for $x in doc("tktl.xml")/kurssit/kurssi valitsisi siis kuvan 3 dokumentista (olettaen sen olevan tallennettuna tiedostoon tktl.xml) kaikki kurssielementit ja kohdistaisi kyselyn niihin. Muuttuja $x sisältää näin kurssit ja mahdollistaa niiden tarkemman käsittelyn niitä
6 iteroidessa. XML-dokumentti tktl.xml: <tietojenkäsittelytiede> <kurssit> <kurssi> <id>132</id> <nimi>ohjelmoinnin perusteet</nimi> </kurssi> <kurssi> <id>875</id> <nimi>rinnakkaisohjelmointi</nimi> </kurssi> </kurssit> <henkilöstö> <henkilö tyyppi="opettaja">olli Opettaja</henkilö> <henkilö tyyppi="hallinto">ella Esimies</henkilö> <henkilö tyyppi="hallinto">jorma Johtaja</henkilö> </henkilöstö> </tietojenkäsittelytiede> XQuery-kysely: for $x in doc("tktl.xml")/tietojenkäsittelytiede/kurssit/kurssi where $x/nimi='rinnakkaisohjelmointi' return $x/id Tulos: <id>875</id> Kuva 3: Esimerkki XQuery-kyselystä. Let-määrittelyssä voidaan asettaa muuttujia niin haluttaessa. Esimerkiksi let $viisi := 5 asettaisi muuttujaan $viisi arvon 5. Where-lausekeessa haulle voidaan asettaa SQL-tyylisiä ehtoja. Sillä voidaan siis valita tuloksiin mukaan vain tietyt ehdot täyttävät elementit. Ehdot voivat kohdistua elementtiin itseensä, elementin jälkeläiseen tai kumman tahansa attribuutteihin. Esimerkiksi ehto where $x/nimi = 'Tietokantojen perusteet' valitsisi vain elementit, joilla on lapsi nimi ja sen arvona 'Tietokantojen perusteet'. Arvojen vertaamiseen on käytössä tutut operaattorit =,!=, <, <=, > ja >=. Order by määrittelee mihin järjestykseen palautetut tiedot järjestetään. Esimerkiksi
7 order by $x/id järjestäisi palautettavat tiedot id-elementissä olevan arvon mukaiseen järjestykseen. Return-lauseke määrittelee mitä valituista tiedoista palautetaan. Sen avulla voidaan esimerkiksi koko elementin sijaan palauttaa vain elementin tietty osa tai attribuutti. Esimerkiksi return $x/nimi palauttaisi vain nimielementit. 3.2 Ehtolauseet XQueryssa on mahdollista käyttää myös If-Then-Else -ehtolauseita, jotka ovat hyödyllisiä erityisesti kun halutaan tulostaa tietoa ehtojen mukaan [MeB06]. Kuvassa 4 on esimerkki siitä, miten ehtolauseita voi käyttää hyödyksi tiedon muuntamisessa halutunlaiseksi. Siinä tietyn attribuutin arvon omaavat elementit muunnetaan toisenlaisiksi elementeiksi. XML-dokumentti tktl.xml: <tietojenkäsittelytiede> <kurssit> <kurssi id="123">ohjelmoinnin perusteet</kurssi> <kurssi id="432">ohjelmoinnin jatkokurssi</kurssi> <kurssi id="876">tietokantojen perusteet</kurssi> <kurssi id="967">rinnakkaisohjelmointi</kurssi> </kurssit> <henkilöstö> <henkilö tyyppi="opettaja">olli Opettaja</henkilö> <henkilö tyyppi="hallinto">ella Esimies</henkilö> <henkilö tyyppi="hallinto">jorma Johtaja</henkilö> </henkilöstö> </tietojenkäsittelytiede> XQuery-lauseke: for $x in doc( tktl.cml )/tietojenkäsittelytiede/henkilöstö/henkilö return if ($x/@tyyppi= opettaja ) then <professori>{data($x)}</professori> else <hallinto>{data($x)}</hallinto> Tulos: <professori>olli Opettaja</professori> <hallinto>ella Esimies</hallinto> <hallinto>jorma Johtaja</hallinto> Kuva 4: Esimerkki XQueryn ehtolauseesta muuntamisen apuna.
Ehtolauseiden käyttämisessä XQueryssa on hyvä huomata, että else-määrittely on aina pakollinen ehdon jälkeen. Sen voi tosin vain jättää tyhjäksi. 8 3.3 Funktiot XQuery ja kappaleessa 2 esitelty XPath jakavat saman funktiokirjaston [BCF02]. XQueryssa on siis käytössä kaikki samat funktiot tiedon käsittelyyn kuin XPathissakin. Funktioita löytyy esimerkiksi merkkijonojen käsittelyyn ja matemaattisiin toimenpiteisiin. XQueryn erikoisuus on käyttäjän itse määrittelemät funktiot, joissa tulee hyvin esiin XQueryn olemus myös ohjelmointikielenä kyselykielen lisäksi. Omat funktiot ovat hyödyllisiä, jos haluaa tehdä automaattisesti monimutkaisempia toimintoja datalle. Funktion määrittely aloitetaan declare function -käskyllä, jossa määritellään funktion mahdolliset parametrit ja palautettavan datan tyyppi. Itse funktio kirjoitetaan aaltosulkujen sisään. 4 XSLT XSLT (Extensible Stylesheet Language Transformations) on XML-pohjainen kieli XML-dokumenttien muuntamiseksi toisiksi dokumenteiksi, kuten esimerkiksi HTMLsivuiksi tai tekstitiedostoiksi [Clar99]. XPathin ja XQueryn lisäksi myös XSLT on W3C:n kehittämä ja ylläpitämä. Sen hakutoiminnot myös perustuvat XPathiin XQueryn tavoin. 4.1 Tiedostojen muunto XSLT:n perustana on XSL-tyylitiedostot, jotka määrittelevät miten lähdedokumentti muunnetaan uudeksi dokumentiksi [Clar99]. XSLT:n voi mieltää olevan XML:lle osittain vastaavanlainen teknologia kuin CSS on HTML:lle. XSLT-prosessorille siis annetaan lähdedokumentti ja XSL-tyylitiedosto, joka sisältää muunnosmäärittelyt. Prosessori luo niiden pohjalta uuden dokumentin. XSLT:n ja XQueryn toiminallisuudet ovat osittain päällekkäisiä, sillä myös XQuery kykenee tiedostojen muuntoon [MeB06]. Molemmilla on kumminkin omat vahvuutensa, koska kummallakin on omat pääkäyttötarkoituksensa.
9 4.2 Syntaksi XSL-tyylitiedostoon määritellään pohjia muunnoksille <xsl-template match= / >elementillä [Clar99]. Match-attribuuttiin asetetaan XPath-lausekkeella alkuperäisen dokumentin osa, johon pohjaa halutaan käyttää. Elementillä <xsl:value-of select= > valitaan jokin tietyn elementin arvo käytettäväksi tyylitiedostossa. Attribuuttiin select asetetaan jälleen XPath-lausekkeella se elementti tai attribuutti, jonka arvo halutaan. Jotta elementtejä ei tarvitsisi valita yksitellen, XSLT tarjoaa <xsl:for-each select=""> -tagin, jolla voi iteroida kokoelmia. Silmukan sisällä voi taas käyttää value-of-toimintoa tiettyjen arvojen näyttämiseen. Iteroitavan kokoelman voi myös järjestää <xsl:sort>komennolla. Ehtolauseiden toteuttamiseen voi XSLT:ssä käyttää käskyjä <xsl:if> ja <xsl:choose>. Kuten XQuery, myös XSLT jakaa saman funktiokirjaston kuin XPath. <?xml version="1.0" encoding="utf-8"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/xsl/transform"> <xsl:template match="/"> <html> <body> <h2>laitoksen kurssit</h2> <ul> <xsl:for-each select="tietojenkäsittelytiede/kurssit"> <li><xsl:value-of select="kurssi"/></li> </xsl:for-each> </ul> </body> </html> </xsl:template> </xsl:stylesheet> Kuva 5: Esimerkki XSL-tyylitiedostosta. 5 Yhteenveto W3C:n kehittämä XML on yhä suosittu metakieli tiedon esittämiseen ja siirtämiseen, varsinkin web-maailmassa. XML-datan kyselyyn on useita teknologioita, joista tässä työssä käsiteltiin kolmea:
10 XPathia, XQuerya ja XSLT:tä. XPath on luonteeltaan oikeastaan melko yksinkertainen, mutta se toimii pohjana useille muille teknologioille, jotka käyttävät sitä kyselyjen alustana. XQuery taas on paljon voimakkaampi datan etsimisessä ja jäsentämisessä. XSLT:n vahvuus sen sijaan on XML-dokumenttien muuntaminen.
11 Lähteet BCF02 Boag, S., Chamberlin, D., Fernández, M. F., Florescu, D., Robie, J., Siméon, J., ja Stefanescu, M. XQuery 1.0: An XML Query Language. World Wide Web Consortium Recommendation, 2002. BPS98 Bray, T., Paoli, J., Sperberg-McQueen, C. M., Maler, E., ja Yergeau, F. Extensible Markup Language (XML). World Wide Web Consortium Recommendation, 1998. Clar99 Clark, J. XSL Transformations (XSLT). World Wide Web Consortium Recommendation, 1999. ClD99 Clark, J., ja DeRose, S. XML Path Language (XPath) version 1.0. World Wide Web Consortium Recommendation, 1999. MeB06 Melton. J., Buxton S. Querying XML: XQuery, XPath, and SQL/XML in Context. Elsevier, 2006, sivut 261 406.