10 Pieni sovellusesimerkki: datalähtöinen grafiikka

Samankaltaiset tiedostot
10 Pieni datalähtöinen sovellusesimerkki

11 Lyhyesti XML-sovellusohjelmoinnista

10 Pieni sovellusesimerkki: datalähtöinen grafiikka

10 Pieni datalähtöinen sovellusesimerkki

XML-tietojenkäsittely

3.27 "Tuotantoesimerkkien" rakenne ja viittaukset (1/2)

Helsingin yliopisto/tktl XML-metakieli XML:n-käsittely. XML:n käsittely ohjelmallisesti. XML:n käsittely ohjelmallisesti

Luento 7: XML-ohjelmointirajapinnat

XML prosessori. XML prosessointi. XML:n kirjoittaminen. Validoiva jäsennin. Tapahtumaohjattu käsittely. Tapahtumaohjattu käsittely.

9.16 XSLT ja nimiavaruudet (1/3): literaali oletusnimiavaruus

XML johdanto, uusimmat standardit ja kehitys

W3C, Web-teknologiat ja XML

Sisältö. XML, XHTML ja CSS XML XML. XML:n ja HTML:n ero. XML kieliä XML XHTML CSS XSL. T Hypermediadokumentin laatiminen 2002

Paikkatiedot ja Web-standardit

4 Web & tekstiformaatit

3 Verkkosaavutettavuuden tekniset perusteet

Tutkitaan sitten HTML-dokumenttien anatomiaa, jotta päästään käsiksi rakenteisten dokumenttien käsitteistöön esimerkkien kautta.

Digitaalisen median tekniikat. JSP ja XML Harri Laine 1

Digitaalisen median tekniikat. JSP ja XML

WWW-ohjelmoinnin kokonaisuus. WWW-OHJELMOINTI 1 Merkkauskielet. Merkkauskielten idea. Merkkauskielet (markup languages) Merkkauskielten merkitys

Concurrency - Rinnakkaisuus. Group: 9 Joni Laine Juho Vähätalo

4. Lausekielinen ohjelmointi 4.1

13/20: Kierrätys kannattaa koodaamisessakin

A TIETORAKENTEET JA ALGORITMIT

ELM GROUP 04. Teemu Laakso Henrik Talarmo

JWT 2017 luento 6. to klo Aulikki Hyrskykari. PinniB Aulikki Hyrskykari

PERL. TIE Principles of Programming Languages. Ryhmä 4: Joonas Lång & Jasmin Laitamäki

Java-kielen perusteet

Digitaalisen median tekniikat. Luento 4: JavaScript

Ohjelmoinnin perusteet Y Python

W3C ja alueellinen standardointi

Hohde Consulting 2004

Java-kielen perusteet

Interfacing Product Data Management System

Interaktiivisten järjestelmien arkkitehtuuriratkaisu, jolla käyttöliittymä erotetaan sovelluslogiikasta.

Uudelleenkäytön jako kahteen

Johdatus rakenteisiin dokumentteihin

6 XML-työkalut 1. 6 XML-työkalut

Interaktiivisten järjestelmien arkkitehtuuriratkaisu, jolla käyttöliittymä erotetaan sovelluslogiikasta.

W3C-teknologiat ja yhteensopivuus

XML, XHTML ja CSS. T Hypermediadokumentin laatiminen. Mikko Pohja

StanForD-XML. Juha-Antti Sorsa, Tapio Räsänen, Vesa Imponen

Ohjelmoinnin perusteet Y Python

XML, standardointi ja kehitys

XSL-muunnokset. 9 XSL-muunnokset

Action Request System

Ohjelmointitaito (ict1td002, 12 op) Kevät Java-ohjelmoinnin alkeita. Tietokoneohjelma. Raine Kauppinen

Sisällys. 18. Abstraktit tietotyypit. Johdanto. Johdanto

Luento 3: Tietorakenteiden esittäminen

Java kahdessa tunnissa. Jyry Suvilehto

7/20: Paketti kasassa ensimmäistä kertaa

Tämän lisäksi listataan ranskalaisin viivoin järjestelmän tarjoama toiminnallisuus:

18. Abstraktit tietotyypit 18.1

Perusteet. Pasi Sarolahti Aalto University School of Electrical Engineering. C-ohjelmointi Kevät Pasi Sarolahti

Tietorakenteet ja algoritmit

Rajapinta (interface)

Hohde Consulting 2004

Ohjelmoinnin peruskurssien laaja oppimäärä

2. Lisää Java-ohjelmoinnin alkeita. Muuttuja ja viittausmuuttuja (1/4) Muuttuja ja viittausmuuttuja (2/4)

ITKP102 Ohjelmointi 1 (6 op)

Tietorakenteet, laskuharjoitus 7,

Ohjelmoinnin peruskurssien laaja oppimäärä

Perusteet. Pasi Sarolahti Aalto University School of Electrical Engineering. C-ohjelmointi Kevät Pasi Sarolahti

DXL Library ja DXL-kielen olemus. Pekka Mäkinen SoftQA Oy http/

Luento 12: XML ja metatieto

Järjestelmäarkkitehtuuri (TK081702)

Järjestelmäarkkitehtuuri (TK081702) Järjestelmäarkkitehtuuri. Järjestelmäarkkitehtuuri

Ohjelmointi 2 / 2010 Välikoe / 26.3

Kääreluokat (oppikirjan luku 9.4) (Wrapper-classes)

Ohjelmoinnin peruskurssien laaja oppimäärä

Järjestelmäarkkitehtuuri (TK081702) AJAX, Asynchronous JavaScript And XML. AJAX, Asynchronous JavaScript And XML

Testidatan generointi

Ohjelmointikielet ja -paradigmat 5op. Markus Norrena

Graafisen käyttöliittymän ohjelmointi

Semanttinen Web. Ossi Nykänen Tampereen teknillinen yliopisto (TTY), DMI / Hypermedialaboratorio W3C Suomen toimisto

Ohjelmoinnin peruskurssien laaja oppimäärä

Semanttinen Web. Ossi Nykänen. Tampereen teknillinen yliopisto (TTY), Digitaalisen median instituutti (DMI), Hypermedialaboratorio W3C Suomen toimisto

JWT 2016 luento 11. to klo Aulikki Hyrskykari. PinniB Aulikki Hyrskykari

SAS:in uudet grafiikkaominaisuudet. Ari Toikka

W3C, XML ja sovellukset

Ohjelmoinnin peruskurssien laaja oppimäärä, kevät

Opintojakso TT00AA11 Ohjelmoinnin jatko (Java): 3 op. Tietorakenneluokkia 2: HashMap, TreeMap

Tutoriaaliläsnäoloista

T Hypermediadokumentin laatiminen. Sisältö. Tavoitteet. Mitä on www-ohjelmointi? Arkkitehtuuri (yleisesti) Interaktiivisuuden keinot

Suunnitteluvaihe prosessissa

Ohjelmoinnin perusteet Y Python

JS-kehitys - yleiskuvaus. TIEA255 - Juho Vepsäläinen

A TIETORAKENTEET JA ALGORITMIT

Ohjelmoinnin jatkokurssi, kurssikoe

XPages käyttö ja edut Jarkko Pietikäinen toimitusjohtaja, Netwell Oy

Uutisjärjestelmä. Vaatimusmäärittely. Web-palvelujen kehittäminen. Versio 1.3

JWT 2016 luento 5. ti klo Aulikki Hyrskykari. PinniB Aulikki Hyrskykari

815338A Ohjelmointikielten periaatteet

11/20: Konepelti auki

Tähtitieteen käytännön menetelmiä Kevät 2009 Luento 5: Python

TIEA341 Funktio-ohjelmointi 1, kevät 2008

Johdatus ohjelmointiin

15. Ohjelmoinnin tekniikkaa 15.1

AS C-ohjelmoinnin peruskurssi 2013: C-kieli käytännössä ja erot Pythoniin

Luento 8: XML-tuki ohjelmointikielissä & Web-palvelut

Transkriptio:

è è è Pieni sovellusesimerkki: datalähtöinen grafiikka 10 Pieni sovellusesimerkki: datalähtöinen grafiikka XSL mahdollistaa erilaisten XML:ää tukevien välineiden hyödyntämisen osana omia sovelluksia. Julkaisutoiminnan näkökulmasta mielenkiintoisia (ja opiskelun kannalta havainnollisia) ovat tekstiä formatoivien sovellusten ohella myös datalähtöiset graafiset sovellukset. Aihepiiri tarjoaa myös aasinsillan SVG:n esittelyyn. 191

è è è Pieni sovellusesimerkki: datalähtöinen grafiikka 10.1 Sovellusesimerkki: esitysgrafiikkaa Halutaan tuottaa piirakkakuvioita, pylväsdiagrammeja yms. esitysgrafiikkaa Esimerkeissä tarkastellaan music-tietoja kappaleiden pituuksilla täydennettynä <music> <album id="ds" year="1978"> <name>dire Straits</name> <tracks> <track len="3m59s">down to the waterline</track> <track len="5m22s">water of love</track> <track len="3m19s">setting me up</track> <track len="4m09s">six blade knife</track>... Miten toteutettaisiin ts. mikä on mahdollista, mitä osataan ja mikä taloudellista/ järkevää? (Seuraavassa tarkastellaan vain eräitä vaihtoehtoja) 192

è è è Pieni sovellusesimerkki: datalähtöinen grafiikka 10.2 Scalable Vector Graphics (SVG) hyvin lyhyesti SVG on XHTML:n tavoin modularisoitu XML-tekstiformaatti (1.0, 1.1, Basic, Tiny) joka tarjoaa keinon määritellä vektorigraafisia ja koostettuja kuvia Perusidea lyhyesti - svg-elementti määrittelee ikkunan (viewport) piirtopinnalle (canvas) - piirtopinnalle asemoidaan tekstistä, viivoista, viivoista koostuvista kuvioista ja rasterikuvista erilaisia objekteja (tasoittain ryhmiteltynä) - tekstillä, viivoilla ja kuvioilla on runsaasti erilaisia attribuutteja (vrt. style) - tekstiä, viivoja, yms. voidaan muuntaa geometrisesti ja piirtää suhteessa toisiin objekteihin - kuvioista voidaan määritellä myös esim. maskeja ja filttereitä (viittausrakenteina) ja kuvioit voivat sisältää myös animaatioita 193

è è è Pieni sovellusesimerkki: datalähtöinen grafiikka 10.3 Esimerkkejä SVG-grafiikasta (1/2) 194

è è è Pieni sovellusesimerkki: datalähtöinen grafiikka 10.4 Esimerkkejä SVG-grafiikasta (2/2) 195

è è è Pieni sovellusesimerkki: datalähtöinen grafiikka 10.5 SVG-dokumentin rakenne SVG-dokumentti on kuten XHTMLdokumentti, mutta XHTML-sanaston ja hypertekstin yms. sijaan puhuu SVG-sanaston avulla vektorigrafiikasta <?xml version="1.0" encoding="iso-8859-1" standalone="no"?> <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/graphics/svg/1.1/dtd/svg11.dtd"> <svg width="12cm" height="4cm" viewbox="0 0 1200 400" xmlns="http://www.w3.org/2000/svg" version="1.1"> <ellipse cx="600" cy="200" rx="550" ry="175" fill="yellow" stroke="blue" stroke-width="20"/> <rect x="1" y="1" width="1198" height="398" fill="none" stroke="blue" stroke-width="2" /> <polygon fill="red" stroke="blue" stroke-width="10" points="350,75 379,161 469,161 397,215 423,301 350,250 277,301 303,215 231,161 321,161" /> <polygon fill="lime" stroke="blue" stroke-width="10" points="850,75 958,137.5 958,262.5 850,325 742,262.6 742,137.5" /> <text x="470" y="240" font-size="70">tekstiä</text> </svg> 196

è è è Pieni sovellusesimerkki: datalähtöinen grafiikka 10.6 Sovellusesimerkin toteutustapa #1: toimistosovellus Kuvataan tieto esim. toimistosovelluksen taulukkolaskentaohjelmaan Tarkastellaan seuraavaksi helppouden/yleisyyden vuoksi "csv-formaattia" Esim. MS Excel hyväksyy seuraavat tiedot 3,9833333333333334; Down to the waterline 5,366666666666666; Water of love 3,3166666666666664; Setting me up 4,15; Six blade knife 2,95; Southbound again 5,566666666666666; Sultans of swing 6,233333333333333; In the gallery 4,7; Wild west end 4,9; Lions Toteutus: m2csv.xsl Jatkokäsittely on helppoa ja monipuolista!...mutta käsityötä music.xml XSLT-pros. data.csv MS Excel... m2csv.xsl 197

è è è Pieni sovellusesimerkki: datalähtöinen grafiikka 10.7 Toteutustapa #2: ohjelmoitu sovellus Ohjelmallinen käsittely on perusedellytys käsityön poistamiselle (mutta molemmissa lähtökohdissa on omat hyvät ja huonot puolensa) Yleiskäyttöisiä grafiikkakirjastoja erilaisten kuvioiden piirtelyyn on kehitetty useille eri sovelluskehittimille ja ohjelmointikielille (ja helppo tehdä lisää...) Tarkastellaan seuraavassa Perl-kielistä toteutusta moduuliin Gd::Graph nojautuen (ks. http://search.cpan.org/) Perl on hyvä, monipuolinen ja hyvin tiivis ohjelmointikieli joka jättää osaavan ohjelmoijan päätettäväksi suuren osan esim. ohjelmointityyliin liittyvistä asioista... Toteutus: pie.pl data.csv Perl-tulkki out.png... pie.pl 198

è è è Pieni sovellusesimerkki: datalähtöinen grafiikka 10.8 Tiiviihkö Perl-ohjelma... use GD::Graph::pie; # Simppeli CSV-parseri: open(in, "data.csv"); while ($line = <IN>) { chomp($line); @arr = split(";", $line); $arr[0] =~ s/,/\./; # korvataan pilkku pisteellä $data[0][$i] = $arr[1]; $data[1][$i++] = $arr[0]+0; # type-cast luvuksi ;) } close IN; # Kuvan teko: my $g = new GD::Graph::pie(300,300); $g->set(start_angle=>90, '3d'=>0); $g->plot(\@data); # Kuvan tulostus PNG-formaatissa: open(out, ">out.png"); binmode(out); print OUT $g->gd->png; close OUT; 199

è è è Pieni sovellusesimerkki: datalähtöinen grafiikka 10.9 Toteutustapa #3: natiivi XML-sovellus Kun XML:stä puhutaan, "luonteva" vaihtoehto on tietenkin rakentaa graafinen sovellus XML-perheen SVG-tekstiformaattiin nojautuen Esimerkkiä on nyt hieman yksinkertaistettu jottei SVG:stä tulisi kovin monimutkaista - pylväitä piirakan sijaan (...jottei juuri laskutoimituksia [max!] eikä kuvaobjektien transformaatioita; helppo toteuttaa 1-vaiheisena muunnoksena) - skaalaus kiinteä (mutta osa kuvapinnasta saattaa jäädä [aluksi] esitettävän näytön ulkopuolelle) Toteutus: m2svg.xsl music.xml XSLT-pros. out.svg m2svg.xsl 200

è è è Pieni sovellusesimerkki: datalähtöinen grafiikka 10.10 Välivaiheita sisältävä prosessointi Koska XSLT (1) ei osaa muuntaa tulospuita, toteutuksissa päädytään usein 2-vaiheiseen prosessointiin "yhden" muunnosaskeleen sisällä - hankalat tietorakenteen "avataan tai normalisoidaan" -...tuloksena käsittelyputkia Käytännössä XML-sovellusohjelmoinnin helppous mahdollistaa kriittisten välivaiheiden toteuttamisen myös lausekielisenä...xslt 2 music.xml XSLT-pros. tmp.xml XSLT-pros. tmp.svg m2tmp.xsl tmp2svg.xsl 201

è è è Pieni sovellusesimerkki: datalähtöinen grafiikka 10.11 Putkilinjaston idea Putkilinjastossa (pipeline) prosessointi jaetaan erityyppisiin käsittelyaskeliin (step), esim. - lukija - muunnin (yhdistäjä, filtteri, ehto, ) - tulostaja Putkilinjasto voi tehdä "mitä tahansa"; keskeinen rajoite on silmukoiden kieltäminen (ts. putki ei saisi edes epäsuoraan lukea omaa tulostettaan) Askel voi koostua aliputkilinjastosta jne. XML-putkissa askeleissa liikkuva tieto on tietenkin (pääosin) XML-muotoista, Tekniikoita: Cocoon, Ant, XProc, ' ' -operaattori, ; ks. esim. http://www.w3.org/tr/xproc/ (Kuva: W3C 2007) 202

è è è Pieni sovellusesimerkki: datalähtöinen grafiikka 10.12 Huomautuksia (1/2) Toteutustapa #3 mahdollistaa toteutustavan #2 ohjelmoimisen esim. XSLT-prosessin muodossa (vrt. kaaviokuva ohessa) music.xml Käytännössä tämä tarkoittaa sitä että XSLTtekniikan avulla toteutettuja prosesseja voi abstrahoida "kapseloimalla" usein toistuvia tehtäviä "aliohjelmien" tavoin - so. määritellään dokumenttityyppi graphdata johon kerätään esitysgrafiikkaan liittyvä data määrämuotoisena ja toteutetaan vastaava (yleiskäyttöinen) XSLT-sovellus MakePie tms. Kätevää! (Vai onko?) XSLT-pros. graph-data.xml MakePie (XSLTpros. + g2p.xsl) out.svg...? m2gd.xsl pieconfig.xml 203

è è è Pieni sovellusesimerkki: datalähtöinen grafiikka 10.13 Huomautuksia (2/2) Periaatteessa kelpo toimistosovellus tai kuvankäsittelyohjelma voi osata lukea XML:ää sellaisenaankin (esim. SVG on YA grafiikkaformaatti) Käytännössä ei kuitenkaan ole taattua, että eri ohjelmien XML-formaatit... 1. noudattavat jotain standardia tekstiformaattia (esim. SVG), 2. on kelvollisesti dokumentoitu (julkisesti), tai 3. ovat pysyviä. Myös XSL-muunnosten rajat tulevat käytännössä melko nopeasti vastaan - ohjelmoinnin kömpelyytenä ja/tai - esim. funktioiden puutteena (max) "oikea" XML-sovellusten ohjelmointi (prosessoriohjelmointi), - (muista kuitenkin miten helppoa on esim. muunnos XML csv...) 204

11 Lyhyesti XML-sovellusohjelmoinnista Jos sopivaa XML-sovellusta ei löydy valmiina, voi sellaisen ohjelmoida itse. XML-sovellusohjelmointi ei oleellisesti poikkea "muusta sovellusohjelmoinnista"; kyse on vain tiettyjen annettujen rajapintojen (yl. SAX/ DOM-variantteja) parissa tapahtuvasta työskentelystä. Tässä yhteydessä tarkastelemme asiaa varsin pintapuolisesti. Kuten ohjelmoinnissa yleensä, myös XML-sovelluksen ohjelmoinnin helppous tai vaikeus riippuu lähinnä sovelluksesta (reunaehdot ja riippuvuudet). 205

11.1 XML-sovellusohjelmoinnin arkkitapaukset Kaikki sovellukset on joku tietenkin ohjelmoinut XMLsovellusohjelmoinnin avulla voidaan siis "tehdä mitä tahansa" Käytännössä pihvi käy ilmi tyypillisistä käyttötapauksista: 1. halutaan lukea tietyn tekstiformaatin mukainen XML-dokumentti ja kansoittaa sen sisältämien tietojen avulla oman ohjelman tietorakenne 2. halutaan toteuttaa oma (standardinmukainen) käsittelijä esim. XSLTprosessoriin, Cocooniin, tms. 3. halutaan hyödyntää jonkun toisen tekemää XML-ohjelmaa 4. halutaan tuottaa XML-dokumentteja ohjelmallisesti (!) On tietenkin melko hankalaa esim. kirjoittaa uusi verkkoselain tai hyvä XMLeditori (tyhjästä) sovellusten pulmat eivät siis usein liity XML:ään sinänsä 206

11.2 Pari sanaa suunnittelumalleista Suunnittelumalli (design pattern) on ohjelmistosuunnittelun menetelmällinen työväline jonka avulla pyritään ratkomaan usein toistuvia ohjelmointitehtäviä hyväksi havaittujen (abstraktien) ratkaisumallien avulla - esim. delegation, interface, factory, filter, treewalker - esim. m2csv.xsl voidaan tulkita adapter-suunnittelumallin mukaan XML-ohjelmoinnissa esim. (1) event listener ja (2) iterator - 1: Olio R lukee tietovirtaa. Olio EL rekisteröityy kuuntelijaksi (kiinnostunut tapahtumista a ja b). Kun A havaitsee tapahtuman a tai b, se välittää tiedon rekisteröityneille kuuntelijoille (myös EL:lle). - 2: Olio I käy tietorakenteen (esim. haun tulos) T läpi sopivassa järjestyksessä. I:tä käyttävä A voi läpikäydä T:n ilman sen sis. tuntemusta. Periaatteessa jopa itse XML-prosessori voidaan tulkita suunnittelumalliksi 207

11.3 XML-sovellusohjelmoinnin "kaksi tasoa" (1/2) "Matalan tason" ohjelmointi lähtee liikkeelle XML-dokumenteista tietorakenteina: ohjelmointia tavallisilla C/C++/Java/... -kehitysvälineillä 1. Tapahtumapohjainen ohjelmointi (SAX-rajapinta [Simple API for XML]) 2. DOM-pohjainen ohjelmointi (DOM-rajapinta [Document Object Model]) xml-dok. XML-prosessori (non-validating/ validating/ns/no-ns) SAX DOM Sovellus 1 Sovellus 2... 208

11.4 XML-sovellusohjelmoinnin "kaksi tasoa" (2/2) "Korkeamman tason" sovelluskehitys hyödyntää standardisovelluksia (?- prosessorit,?-komponentit) - sovelluksen kuvaaminen prosessorin/komponentin avulla tai sen syötteenä/vasteena (esim. XQuery, XSLT, Web Services,...; kyselyt/filtterit/ muunnokset/viestit/...) "Tasot" eivät tietenkään ole poissulkevia (vrt. juuri XSLT & SAXohjelmointi) 209

11.5 XML-sovellusohjelmoinnista Leijonaosa XML-sovelluksista kirjoitetaan Javakielellä (vrt. kurssikirjan esimerkit) - aito oliokieli, paljon kirjastoja ja välineitä, Internetohjelmoinnin helppous -...toisaalta "yhden valmistajan tuote", melko jäykkä oliosyntaksi,... Muita yleisesti käytettäviä välineitä ovat esim. C/C++, Python, Perl, PHP,... XML-ohjelmointi eri välineillä on perusidealtaan samanlaista, mutta välinekohtaiset toteutukset (ja lisät) tuovat työhön omia erityispiirteitään - Esim. Java/C++: Xerces, Perl: XML::Parser, Python: xml.* - eri toteutusten taustalta löytyy usein samoja (alunperin C-kielellä kirjoitettuja) jäsentimiä 210

11.6 SAX: Simple API for XML SAX (1/2) on tapahtumapohjainen rajapinta XML-dokumenttien käsittelyyn <?xml version="1.0" encoding="iso-8859-1"?> <muistio pvm="2004-03-22"> <luokitus>hpn-projekti</luokitus> <otsikko>uusi tilaus tulossa?</otsikko> <kirjoittaja>teuvo Oinas</kirjoittaja> <asia> Brasilian tehdas on pyytänyt arvion Soijakattilan uusimisen kustannuksista. <!-- Sirpa korjasi kirjoitusvirheet 2004-03- 23. --> </asia> </muistio> - lähdedokumentin loogiset osat nähdään siinä järjestyksessä kun ne tulevat dokumenttia luettaessa vastaan (v1 ei osaa tallettaa tiedostoja, eikä ymmärrä nimiavaruuksia) SAX-pohjaisen XMLohjelman idea ~ startdocument() startelement("muistio") startelement("luokitus") characters("hpnprojekti") endelement("luokitus") startelement("otsikko")... endelement("muistio") enddocument() 211

11.7 SAX-ohjelmoinnin tyypillisiä käyttötapauksia Tyypillinen motiivi - ohjelman nopea suoritus ja pieni koko (myös muistinkulutuksen osalta) - käsittelijöiden kirjoittamisen helppous ("suurin pulma on etsiä dokumentaatiosta miten oma SAX-käsittelijä rekisteröidään") Esimerkkejä - Halutaan lukea XML-dokumentin tietoja konfiguraatiotiedostojen hengessä - Halutaan kirjoittaa SAX-käsittelijä johonkin XML-prosessoriin (esim. laajennuksena SAX-käsittelijä XSL-muuntimeen) Hankaluuksia: - vähääkään monimutkaisempi sovellus edellyttää oman (...puumaisen?) tieorakenteen rakentamista (tai assosiatiivisia taulukoita ) Tarkastellaan seuraavassa havainnollisuuden vuoksi XML-sovelluksen kirjoittamista aluksi Perl-kielellä, XML::Parser-moduulin nojautuen 212

11.8 Yksinkertaista XML-sovellusohjelmointia Perlillä Perl (Practical Expression Report Language) on erittäin suosittu (tulkattava) ohjelmointikieli (suosittu "skriptikieli") joka soveltuu hyvin esim. *nixtyyppisten käsittelijöiden toteuttamiseen - hyvä ja dokumentoitu pakettikirjasto, moduulit - dynaaminen tyypitys, nopea (käännös tavukoodiksi ennen suoritusta) - olio-ohjelmoinnin piirteet (niin haluttaessa...) Perlin "erikoisuus" on mahdollisuus kirjoittaa hyvin tiivistä syntaksia (=rivimäärässä lyhyitä mutta monipuolisia ohjelmia) sekä säännönmukaisten lausekkeiden (regular expression) vahva rooli sovelluksissa Perl-ohjelmoinnin vahvuus (ja heikkous) on dynaamisten tietorakenteiden avulla (skalaarit, taulukot ja listat, assosiatiiviset taulukot) helposti ja nopeasti toteutettavat tietorakenteet (yms. quick and dirty -ohjelmoinnin riskit) 213

11.9 Pieni tapahtumaohjattu XML-käsittelijä (Perl) Huomaa dokumentin lukujärjestykseen sidottu käsittely (kirjanpito!) use XML::Parser; $parser = new XML::Parser( Handlers => { Start => \&element_start, End => \&element_end, Char => \&characters}); $in_right_album = 0, @lens=(), $in_right_name, $name=""; sub element_start { my ($xp, $element, %attr) = @_; if ($element eq "album" && $attr{id} eq "ds") { $in_right_album = 1; } if ($element eq "track" && $in_right_album==1) { $v = $attr{len}; $v =~ s/m/\./; $v =~ s/s//; push(@lens, $v+0); } if ($element eq "name" && $in_right_album==1) { $in_right_name = 1; 214

} } sub element_end { my ($xp, $element) = @_; if ($element eq "album" && $in_right_album==1) { $in_right_album = 0; } if ($element eq "name" && $in_right_name==1) { $in_right_name = 0; } } sub characters { my ($xp, $text) = @_; if ($in_right_name==1) { $name.= $text; } } $parser->parsefile('music.xml'); print "$name \n"; foreach my $k (@lens) { print "$k "; } 215

11.10 DOM: Document Object Model DOM (1/2/3) on objektipohjainen rajapinta XML-dokumenttien käsittelyyn - dokumentti jäsennetään ensin objektipuuksi, jossa voidaan liikkua solmusta toiseen kyselyjen ja iteraattoreiden avulla - vapaa liikkuminen puurakenteessa (monimutkaisuus ja muistinkulutus) DOM-pohjaisen XML-ohjelman idea ~ <muistio> @pvm <luokitus> <otsikko> 2004-03... HPN-pro... Uusi while( (child=iterator.nextnode())!=null) { } process(child); <kirjoittaja <asia> Teuvo O... Brasilian..... Element liiteelement = doc.createelement("liite"); inode.appendchild(liiteelement);... 216

11.11 DOM2 pähkinänkuoressa (1/4): Node-rajapinta DOM-jäsennyspuun tunnistamat solmutyypit (*_NODE) ovat - ELEMENT, ATTRIBUTE, TEXT, CDATA_SECTION, ENTITY_REFERENCE, ENTITY, PROCESSING_INSTRUCTION, COMMENT, DOCUMENT, DOCUMENT_TYPE, DOCUMENT_FRAGMENT ja NOTATION DOM määrittelee oleellisesti joukon rajapintoja erityyppisten solmujen käsittelyyn. Perusrajapinta on Node (vrt. DOM 2 Core) interface Node { // NodeType (nyt tunnistenimien määrittely [ks. yllä] leikattu pois)... readonly attribute DOMString nodename; attribute DOMString nodevalue; // raises(domexception) on setting // raises(domexception) on retrieval 217

readonly attribute unsigned short nodetype; readonly attribute Node parentnode; readonly attribute NodeList childnodes; readonly attribute Node firstchild; readonly attribute Node lastchild; readonly attribute Node previoussibling; readonly attribute Node nextsibling; readonly attribute NamedNodeMap attributes; // Modified in DOM Level 2: readonly attribute Document ownerdocument; Node insertbefore(in Node newchild, in Node refchild) raises(domexception); Node replacechild(in Node newchild, in Node oldchild) raises(domexception); Node removechild(in Node oldchild) raises(domexception); Node appendchild(in Node newchild) raises(domexception); boolean haschildnodes(); Node clonenode(in boolean deep); 218

// Modified in DOM Level 2: void normalize(); // Introduced in DOM Level 2: boolean issupported(in DOMString feature, in DOMString version); // Introduced in DOM Level 2: readonly attribute DOMString namespaceuri; // Introduced in DOM Level 2: attribute DOMString prefix; // raises(domexception) on setting // Introduced in DOM Level 2: readonly attribute DOMString localname; // Introduced in DOM Level 2: boolean hasattributes(); }; 219

11.12 DOM2 pähkinänkuoressa (2/4): Document-rajapinta Kullekin solmutyypille on lisäksi oma erikoistunut rajapintansa, näistä (yleensä) tärkeimmät ovat Document (ks. alla) ja Element interface Document : Node { readonly attribute DocumentType doctype; readonly attribute DOMImplementation implementation; readonly attribute Element documentelement; Element createelement(in DOMString tagname) raises(domexception); DocumentFragment createdocumentfragment(); Text createtextnode(in DOMString data); Comment createcomment(in DOMString data); CDATASection createcdatasection(in DOMString data) raises(domexception); ProcessingInstruction createprocessinginstruction(in DOMString target, in DOMString data) raises(domexception); Attr createattribute(in DOMString name) raises(domexception); 220

EntityReference createentityreference(in DOMString name) raises(domexception); NodeList getelementsbytagname(in DOMString tagname); // Introduced in DOM Level 2: Node importnode(in Node importednode, in boolean deep) raises(domexception); // Introduced in DOM Level 2: Element createelementns(in DOMString namespaceuri, in DOMString qualifiedname) raises(domexception); // Introduced in DOM Level 2: Attr createattributens(in DOMString namespaceuri, in DOMString qualifiedname) raises(domexception); // Introduced in DOM Level 2: NodeList getelementsbytagnamens(in DOMString namespaceuri, in DOMString localname); // Introduced in DOM Level 2: Element getelementbyid(in DOMString elementid); }; 221

11.13 DOM2 pähkinänkuoressa (3/4): Element-rajapinta interface Element : Node { readonly attribute DOMString tagname; DOMString getattribute(in DOMString name); void setattribute(in DOMString name, in DOMString value) raises(domexception); void removeattribute(in DOMString name) raises(domexception); Attr getattributenode(in DOMString name); Attr setattributenode(in Attr newattr) raises(domexception); Attr removeattributenode(in Attr oldattr) raises(domexception); NodeList getelementsbytagname(in DOMString name); // Introduced in DOM Level 2: DOMString getattributens(in DOMString namespaceuri, in DOMString localname); // Introduced in DOM Level 2: void setattributens(in DOMString namespaceuri, 222

in DOMString qualifiedname, in DOMString value) raises(domexception); // Introduced in DOM Level 2: void removeattributens(in DOMString namespaceuri, in DOMString localname) raises(domexception); // Introduced in DOM Level 2: Attr getattributenodens(in DOMString namespaceuri, in DOMString localname); // Introduced in DOM Level 2: Attr setattributenodens(in Attr newattr) raises(domexception); // Introduced in DOM Level 2: NodeList getelementsbytagnamens(in DOMString namespaceuri, in DOMString localname); // Introduced in DOM Level 2: boolean hasattribute(in DOMString name); // Introduced in DOM Level 2: boolean hasattributens(in DOMString namespaceuri, in DOMString localname); }; 223

11.14 DOM2 pähkinänkuoressa (4/4) Kuten SAX2:n tapauksessa, DOM2:n myötä DOM-rajapinta mahdollistaa nimiavaruuksien käsittelyn DOM 2 koostuu itse asiassa neljästä osasta: - (1) DOM Level 2 Core Specification - (2) DOM Level 2 Traversal and Range Specification - (3) DOM Level 2 Events Specification - (4) DOM Level 2 Style Specification -...joista (1) esiteltiin edellä, (2) sisältää kulkurajapintoja ja mahdollistaa DOM-puun manipuloinnin ns. valinnan (range) avulla, (3) luo pohjan esim. skripteihin nojautuvien selainten toteutukseen (vrt. XHTML+Ecmascript) ja (4) määrittele CSS2:n DOM-puun Myös DOM 3 on olemassa; yleensä DOM2 kuitenkin riittää (paitsi näppäimistötapahtumien osalta!) 224

11.15 Yksinkertaista XML-sovellusohjelmointia Pythonilla Python (nimi tulee Monty Pythonista...) on korkean tason ohjelmointikieli joka "sijoittuu jonnekin Perlin ja Javan välimaastoon" - hyvä ja dokumentoitu pakettikirjasto, moduulit - dynaaminen tyypitys, melko nopea (oletusarvoisesti tulkattava) - todella selkeä oliokieli, helppo kehittää myös olio-ohjelmia iteratiivisesti Python "erikoisuuksia" ovat syntaksi (pakotettu ohjelmakoodin sisennys) ja esim. tehokas listojen käsittely (esim. taulu[:1]) Python-ohjelmoinnin vahvuus on olio-ohjelmoinnin ja skriptikielen "hyvien piirteiden" onnistunut yhdistäminen, keskeisin heikkous lienee hitaiden ohjelmien kirjoittamisen helppous (koska paljon korkean tason välineitä on käytössä jo itse kielen tasolla) 225

11.16 Pieni DOM-pohjainen sovellus (Python) import xml.dom; from xml.dom.minidom import Node, Attr from fpformat import fix; doc = xml.dom.minidom.parse("music.xml"); nodes = doc.getelementsbytagname("album"); # Taas karseita olettamuksia kappaletietojen formaatin suhteen...(mitä?) for k in range(len(nodes)): total = 0 for node in nodes[k].getelementsbytagname("track"): tlen = node.getattribute("len"); if len(tlen)<1: continue; # lasketaan levyn pituus sekunteina total = total + float(tlen[:1])*60 + float(tlen[2:4]); total = fix(total/60,0) + "M" + fix(total-float(fix(total/60,0))*60,0) + "S"; nodes[k].setattribute("total",total); print doc.toxml(); doc.unlink(); 226

11.17 XML-pohjaista skriptiohjelmointia? DOM kehitettiin alunperin esim. selaimissa esitettävien XML-dokumenttien skriptiohjelmoinnin tarpeisiin - DOM sisältää tätä varten GUIrajapintamäärittelyn (& XML Events) Skritpiohjelmointi mahdollistaa periaatteessa minkä tahansa selaimen läpi näkyvän (skriptejä tukevan) XML-sovelluksen ohjelmoinnin - esim. SVG-esitysten manipulointi Ecmascriptillä - yleisesti ottaen kesk. ongelma ovat eri selaintoteutusten eroavaisuudet (toteutusten puutteet ja versiointi) ja sekä esim. saavutettavuuspulmat XML-sovellusohjelmoinnin näkökulmasta (selaimen) läpi tapahtuva skriptiohjelmointi voi olla pulmallista (paitsi jos selain tms. katseluohjelma voidaan kiinnittää hyvin tarkasti, esim. plugin-tekniikoin) 227

11.18 XML, DOM ja ohjelmointi Esimerkkejä - SVG ja DOM-puun rakenne - yksinkertaista DOM-ohjelmointia (SVGfraktaaliesimerkki) - tapahtumankäsittelijöistä (DOM2 vs. DOM3) Huomaa että (XML-sovellus)ohjelmoinnissa voidaan nähdä kaksi keskeistä sovelluskenttää: - reaktiiviset sovellukset (esim. interaktiivinen, käyttöliittymätapahtumiin reagoiva SVG-sovellus) - prosessorimaiset sovellukset (esim. tuotetietojen koostaminen ja tulostaminen XHTML-muotoon) 228

11.19 Vielä XSLT-ohjelmoinnista: XSLT 2 XSLT 2:n myötä XSLT-kielen sovellusala on laajentunut siten, että prosessorisovellusten toteuttaminen onnistuu XSLT:n avulla entistä paremmin. Keskeisiä uusia piirteitä ovat mm.: - muunnos voi kohdistaa sääntöjä myös sisäisten, itse tuottamiensa (puu)tietorakenteiden käsittelyyn - muunnos voi tuottaa useita tulosdokumentteja - tietotyyppien käyttö on mahdollista mm. muuttujissa ja hahmoissa - käytössä on laaja funktiokirjasto, myös omien funktioiden määrittely on mahdollista - kieltä on rikastettu mm. ryhmittelyn, sarjallistuksen ja hahmonsovituksen hallinnan osalta - ks. http://www.w3.org/tr/xslt20/ 229

11.20 XSLT2-esimerkki: "RSS Burger 0.1" +==============+ /===============================\ +========+ rss-config.xml ==> /========\ +====+ /=========\ => out.html +==============+ populate => tree => printhtml +========+ \========/ +====+ \=========/ +==>\===============================/=+ debug? +=============================+ +========+ /secondary input files (RSS)/ +==> tree.xml +=============================+ +========+ Figure 1: A conceptual perspective to the internal XSLT Ks. esimerkki l20-xslt2-rss 230

11.21 Lopuksi XML-sovellusohjelmoinnin näkökulmasta "XML" näyttäytyy lähinnä standardinmukaisena tietorakenteena sekä valmiina saatavina jäsentiminä, sovelluksina ja rajapintoina -- XML-sovelluskehityksessä pyritäänkin yleensä hyödyntämään mahdollisimman paljon valmiskomponentteja Hyvä strategia oman sovelluksen toteuttamiseen: Onko valmista toteutusta saatavilla? Mikä on keskeisesti puuttuva komponentti? Onko (osa)tehtävä kierrettävissä esim. muunnoksella sopivan sovelluksen kautta ja kuinka paljon koodia kirjoitetaan itse? Kannattaa muistaa, että yksinkertainen perustekniikka mahdollistaa usein monimutkaisten sovellusten ymmärtämisen; monimutkainen perustekniikka taas saattaa tehdä yksinkertaistenkin sovellusten ymmärtämisen vaikeaksi (paitsi muutaman oppikirjamaisen erikoistapauksen osalta). Tasapainon löytäminen monimutkaisuuden hallinnassa on erittäin vaikeaa ja rajatuissakin sovelluksissa edellyttää yleensä kokemuksen myötä tulevaa "ammattitaitoa" 231