XML-datan kysely

Web-teknologiat
XML-datan kysely
Topi Sarkkinen
Sisältö
●
●
●
●
XML (lyhyesti)
XPath
XQuery
XSLT
XML
● Extensible Markup Language
● Ihmisten ja koneiden luettava metakieli, jolla
voidaan määritellä muitakin kieliä
● Dokumentit, tiedon esittäminen, tiedon
välitys
● Koostuu tekstipohjaisista elementeistä
○ <esim>Tämä on XML-elementti</esim>
XML - Esimerkki
<?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>
XPath
● XML Path Language
● W3C Recommendation 1999
● XML-dokumentin osien valitsemisen perusta
○ Melko yksinkertainen
○ Useat muut teknologiat pohjautuvat XPathiin
■ XQuery, XSLT...
XPath - Elementtien valinta
● Perustuu XML-dokumentin puumaiseen
rakenteeseen, jota pitkin liikutaan
● XPath-lauseke koostuu peräkkäisistä
askeleista, joilla päästään haluttuihin
elementteihin
● Lauseke koostuu kolmesta osasta
○ Akselimäärittely, solmutesti, ehtolause
XPath - Akselimäärittely
● Liikkumissuunta XML-dokumentissa
○ Lapset (/), jälkeläiset (//), attribuutit (@) ym.
● Elementtien A lapset B: A/B
● Elementtien A jälkeläiset B: A//B
● Määritellään joka askeleen välissä
XPath - Solmutesti
● Mitä kyseisellä askeleella valitaan
● Yleensä vain solmun nimi
● Esim. A/B: A ja B ovat solmutestit
XPath - Ehtolause
● Ei pakollinen, mutta voidaan myös määrittää
jokaiselle askeleelle useitakin
● Ehtoja löytyneiden elementtien
valitsemiseen
● Askeleen lopussa hakasulkujen sisällä
● A/B[@nimi = ‘Topi’]
○ A:n lapset B, joilla attribuutti nimi arvolla ‘Topi’
XPath - Funktiot ja operaattorit
● XPath-haun tuloksia voi myös käsitellä
erilaisilla funktioilla ja operaattoreilla
● Merkkijonofunktiot
○ concat, substring, contains...
● Aritmeettiset operaatiot
○ +, -, sum...
XPath - Esimerkki
/tietojenkäsittelytiede
<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 - Esimerkki
/tietojenkäsittelytiede/henkilöstö/
<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 - Esimerkki
/tietojenkäsittelytiede/henkilöstö/henkilö
<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 - Esimerkki
/tietojenkäsittelytiede/henkilöstö/henkilö[@tyyppi="hallinto"]
<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 - Esimerkki
/tietojenkäsittelytiede/henkilöstö/henkilö[@tyyppi="hallinto"][1]
<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
●
●
●
●
●
XML Query
W3C Recommendation 2002
Kysely- ja ohjelmointikieli
Datan kyselyyn ja muuntamiseen
Voi käyttää myös esim. HTML-dokumenttien
kanssa
XQuery
● Rakennettu XPathin pohjalta
○ Voi käyttää suoraan XPath-lausekkeita
● Mutta myös: “XQuery on XML-dokumenteille
kuten SQL on tietokannoille”
○ Etsitään XML-dokumenteista tietoa
○ SQL-tyylinen syntaksi
■ Where, order by, join…
XQuery - FLWOR
● For, Let, Where, Order by, Return
○ SQL-tyylinen syntaksi
XQuery - FLWOR - FOR
● Mihin dokumenttiin tai kokoelmaan kysely
tehdään
● Määritellään XPath-lausekkeella
● Asettaa löydetyt elementit määriteltyyn
muuttujaan ja aloittaa niiden iteroinnin
for $x in doc("tktl.xml")/tietojenkäsittelytiede/kurssit/kurssi
XQuery - FLWOR - FOR
● Mihin dokumenttiin tai kokoelmaan kysely
tehdään
● Määritellään XPath-lausekkeella
● Asettaa löydetyt elementit määriteltyyn
muuttujaan ja aloittaa niiden iteroinnin
for $x in doc("tktl.xml")/tietojenkäsittelytiede/kurssit/kurssi
XQuery - FLWOR - LET
● Mahdollista määritellä muuttujia
let $viisi := 5
XQuery - FLWOR - WHERE
● Haulle SQL-tyylisiä ehtoja
○ Suodatetaan siis mukaan vain tietyt ehdot täyttävät
● Ehdot voivat kohdistua:
○ Elementtiin itseensä
○ Elementin jälkeläiseen
○ Kumman tahansa attribuuttiin
where $x/nimi = 'Tietokantojen perusteet'
XQuery - FLWOR - ORDER BY
● Palautettavien tietojen järjestys
order by $x/id
XQuery - FLWOR - RETURN
● Mitä palautetaan
● Voidaan koko elementin sijaan palauttaa
esim. tietty osa, lapsi tai attribuutti
return $x/nimi
XQuery - Ehtolauseet
● If - Then - Else
● Voidaan käyttää hyödyksi esim. tiedon
muuntamisessa
return if ($x/@tyyppi=”opettaja”)
then <professori>{data($x)}</professori>
else <hallinto>{data($x)}</hallinto>
XQuery - Funktiot
● Käytössä yhteinen funktiokirjasto XPathin
kanssa
● Merkkijonojen käsittely
● Matemaattiset funktiot
● Ym...
XQuery - Funktiot
● Voi kuitenkin myös määritellä omia funktioita
● Alkaa declare function -käskyllä
○ Määritellään parametrit ja palautettavan datan tyyppi
declare function local:alennettuHinta($hinta as xs:decimal, $alennusProsentti as xs:decimal) as xs:decimal {
let $alennus := ($hinta * $alennusProsentti) div 100
return $hinta - $alennus
}
XSLT
● Extensible Stylesheet Language
Transformations
● W3C Recommendation 1999
● XML-dokumenttien muuntaminen toisiksi
dokumenteiksi
● Elementtien valinta perustuu taas XPathiin
XSLT
● CSS & HTML = XSLT & XML?
● XSLT-prosessorille annetaan
lähdedokumentti ja XSL-tyylitiedosto
○ Tekee uuden dokumentin tyylitiedoston määrityksien
mukaisesti
XSLT - Syntaksi
● <xsl-template match=”/”>
○ Pohjia muunnoksille
○ Matchiin XPathilla alkuperäisen dokumentin osa, jota
käytetään
● <xsl:value-of select=””>
○ Valitaan alkuperäisestä dokumentista
elementtejä/attribuutteja XPathilla
● <xsl:for-each select="">
○ Iteroidaan kokoelmia
XSLT - Esimerkki
<?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/kurssi">
<li><xsl:value-of select="kurssi"/></li>
</xsl:for-each>
</ul>
</body>
</html>
</xsl:template>
</xsl:stylesheet>
Yhteenveto
● XML
○ Haastajia kuten JSON, mutta vielä hyvin suosittu
● XPath
○ Yksinkertainen, mutta luo pohjan XML-kyselyille
● XQuery
○ Voimakkaampi, SQL-tyylinen
● XSLT
○ Dokumenttien muunto
Kiitos!