Kennet Tast XML-TIETOKANTASOVELLUS



Samankaltaiset tiedostot
XQuery tietokannan kyselykielenä

Web-teknologiat. XML-datan kysely Topi Sarkkinen

Hohde Consulting 2004

SQL-perusteet, SELECT-, INSERT-, CREATE-lauseet

Jussi Klemola 3D- KEITTIÖSUUNNITTELUOHJELMAN KÄYTTÖÖNOTTO

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

PROSEDUURIT, FUNKTIOT JA HERÄTTIMET - ESIMERKKEINÄ ORACLE, SQL SERVER, MYSQL JA OCELOT JOUNI HUOTARI K2009

FinFamily PostgreSQL installation ( ) FinFamily PostgreSQL

Proseduurit, funktiot ja herättimet - esimerkkeinä Oracle, SQL Server, MySQL ja OCELOT. Jouni Huotari S2008

1.3Lohkorakenne muodostetaan käyttämällä a) puolipistettä b) aaltosulkeita c) BEGIN ja END lausekkeita d) sisennystä

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

Tiedonhallinnan perusteet. Viikko 1 Jukka Lähetkangas

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

HSMT Tietokannoista. Ville Leppänen. HSMT, c Ville Leppänen, IT, Turun yliopisto, 2008 p.1/32

Written by Administrator Monday, 05 September :14 - Last Updated Thursday, 23 February :36

Ohjelmointikielet ja -paradigmat 5op. Markus Norrena

TIETOKANNAT: MYSQL & POSTGRESQL Seminaarityö

Ohjelmoinnin perusteet Y Python

TIEDONHALLINTA - SYKSY Luento 11. Hannu Markkanen /10/12 Helsinki Metropolia University of Applied Sciences

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

Kirjasto Relaatiotietokannat Kevät Auvinen Annemari Niemi Anu Passoja Jonna Pulli Jari Tersa Tiina

1.3 Lohkorakenne muodostetaan käyttämällä a) puolipistettä b) aaltosulkeita c) BEGIN ja END lausekkeita d) sisennystä

Action Request System

SQL - STRUCTURED QUERY LANGUAGE

Helpottuuko sovellusten välinen integraatio XML:n avulla - kokemuksia ja ratkaisuja, teknologiajohtaja Sauli Tujunen, atbusiness Communications Oyj

Interfacing Product Data Management System

Ohjelmistojen mallintamisen ja tietokantojen perusteiden yhteys

HTML & CSS. HTML (HyperText Markup Language) Antti Koivisto. ! HTML on sivujen kuvauskieli.

Luento 5. Timo Savola. 28. huhtikuuta 2006

WWW-sivut HTML-kielellä esitettyä hypertekstiaineistoa

Koottu lause; { ja } -merkkien väliin kirjoitetut lauseet muodostavat lohkon, jonka sisällä lauseet suoritetaan peräkkäin.

Tietokannan hallinta. Kevät 2004 Jan Lindström R&G Chapter 1

Tietorakenteet ja algoritmit

FinFamily Installation and importing data ( ) FinFamily Asennus / Installation

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

SQLite selvitysraportti. Juha Veijonen, Ari Laukkanen, Matti Eronen. Maaliskuu 2010

Insert lauseella on kaksi muotoa: insert into taulu [(sarakenimet)] values (arvot)

JavaScript alkeet Esimerkkikoodeja moniste 2 ( Metropolia)

ITKP102 Ohjelmointi 1 (6 op)

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

812336A C++ -kielen perusteet,

TIETOKANNAT JOHDANTO

Harjoituksen aiheena on tietokantapalvelimen asentaminen ja testaaminen. Asennetaan MySQL-tietokanta. Hieman linkkejä:

Opettajana Mika Sorsa, HAMK:n ammatillisen opettajakoulutuksen opetusharjoittelija

On instrument costs in decentralized macroeconomic decision making (Helsingin Kauppakorkeakoulun julkaisuja ; D-31)

Harjoitustyö: virtuaalikone

Chapel. TIE Ryhmä 91. Joonas Eloranta Lari Valtonen

Alkuun HTML5 peliohjelmoinnissa

Ohjelmoinnin peruskurssi Y1

Listarakenne (ArrayList-luokka)

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

Android ohjelmointi Tunti 2. Käyttöliittymät ja resurssit

Helsingin yliopisto/tktl DO Tietokantojen perusteet, s 2000 Johdanto & yleistä Harri Laine 1. Tietokanta. Tiedosto

Haaga-Helia/IltaTiko ict2tcd005: Ohjelmiston suunnittelutaito 1/7 Anne Benson. Tällä opintojaksolla käytämme VS:n kolmen kokonaisuuden luomiseen:

Tietokanta (database)

Lab SBS3.FARM_Hyper-V - Navigating a SharePoint site

SQL Buddy JAMK Labranet Wiki

Ohjelmoinnin perusteet Y Python

Johdatus rakenteisiin dokumentteihin

HOJ Haja-aiheita. Ville Leppänen. HOJ, c Ville Leppänen, IT, Turun yliopisto, 2012 p.1/10

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

Digitaalisen median tekniikat. JSP ja XML Harri Laine 1

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

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

Ohjelmoinnin perusteet Y Python

RATKI 1.0 Käyttäjän ohje

A TIETORAKENTEET JA ALGORITMIT

ELM GROUP 04. Teemu Laakso Henrik Talarmo

Visma Liikkuvan työn ratkaisut Päivitysohje. Pääkäyttäjän opas

CUDA. Moniydinohjelmointi Mikko Honkonen

Toinen harjoitustyö. ASCII-grafiikkaa 2017

jotakin käyttötarkoitusta varten laadittu kokoelma toisiinsa liittyviä säilytettäviä tietoja

T Testiraportti TR-3. ETL-työkalu

IDL - proseduurit. ATK tähtitieteessä. IDL - proseduurit

Tietokannanhoitaja DBA (Database Administrator) ja tietokannan hallinta

7/20: Paketti kasassa ensimmäistä kertaa

P e d a c o d e ohjelmointikoulutus verkossa

ATK tähtitieteessä. Osa 3 - IDL proseduurit ja rakenteet. 18. syyskuuta 2014

LINUX-HARJOITUS, MYSQL

Tietokantakurssit / TKTL

ECDL Tietokannat. Copyright 2015 ECDL Foundation ECDL Tietokannat Sivu 1 / 7

Tietokannan hallintajärjestelmän (DBMS) palvelut ja rakenne

Tiedonlouhinta rakenteisista dokumenteista (seminaarityö)

TIEDONHALLINNAN PERUSTEET - SYKSY 2013

Tehtävä 1. Tietojen lisääminen, poistaminen, päivittäminen ja tulostaminen

1 Tehtävän kuvaus ja analysointi

Ohjelmoinnin perusteet Y Python

Sukupuu -ohjelma. Ossi Väre ( ) Joni Virtanen ( )

Operaattoreiden ylikuormitus. Operaattoreiden kuormitus. Operaattoreiden kuormitus. Operaattoreista. Kuormituksesta

GDAL ja WFS: suora muunnos ogr2ogr-ohjelmalla

D B. Tietokannan hallinta - kurssin tavoite. Kurssilla opitaan periaatteet. Edellytyksenä osallistumiselle on Tietokantojen perusteiden hallinta

Johdanto Javaan ja tietokantojen käsittelyyn Java Database Connectivity (JDBC)

Vaasan yliopiston toimintaa tukevat informaatiopalvelut ovat käytettävissä WWW:n kautta.

4. Lausekielinen ohjelmointi 4.1

Ohjelmoinnin perusteet Y Python

Java-kielen perusteet

Testidatan generointi

Pikaohje formaatin valmistamiseen

Tieto- ja tallennusrakenteet

Muita tietokantaobjekteja. Näkymät, synonyymit, indeksointi, valtuudet ja systeemihakemisto

Transkriptio:

Kennet Tast XML-TIETOKANTASOVELLUS Opinnäytetyö Keski-Pohjanmaan ammattikorkeakoulu Utbildningsprogrammet för Informationsteknik Helmikuu 2008

Keski-Pohjanmaan ammattikorkeakoulu Tietotekniikan koulutusohjelma TIIVISTELMÄ Työn tekijä: Työn nimi: Kennet Tast XML-tietokantasovellus Päivämäärä: 20.1.2008 Sivumäärä: 35 + 4 liitettä Työn ohjaaja: Ville Hietala Työn valvoja: DI. Mats Albäck Opinnäyte työn tarkoituksena oli luoda XML-tietokantasovellus ja tutkia XMLtietokannan toimintaa ja käyttöä sovelluksesta käsin. Sovellus tehtiin Borland C++ Builder 6.0 -ohjelmointityökalulla ja SEDNA XML-tietokantaa käyttäen. Työ alkoi tutkimalla XML-tekniikkaa ja sen tarkoitusta tiedon välittämiseen. XMLdokumenttien tietosisällön käsittelyyn käytetään monia eri tekniikoita ja tapoja. Vanhempi tekniikka, joka on käytössä vieläkin, on DTD, joka määrittelee XMLdokumentissa esiintyvien tietojen tarkistuksen. Koska DTD:n ominaisuudet eivät riittäneet XML-tiedon käsittelyyn laajemmin, kehiteltiin XML-skeema, joka tarjosi paremmat tiedonkäsittelystandardit kuin DTD. Tutkin eri XML-tietokantoja joita mahdollisesti käyttäisin sovelluksessani. Aloitin etsiskelyn W3C-sivuston XQuery testisivulta, jossa on testattu eri tietokantojen kyselykielen toimivuutta. Koska etsin tietokantaa joka olisi ilmainen käytettäväksi kaupallisissa sovelluksissa ja jossa mahdollisesti tulisi ohjelmointirajapinta C/C++ - kielelle, oli valinta helppoa. Valitsin tietokannan SEDNA Xml Database System joka oli kaikkia näitä ja jonka mukana tulivat vielä hyvät ohjeet. Sovelluksen ohjelmoinnin aloitin tutkimalla ohjelmointirajapintaa, joka tuli SEDNAn mukana. Siellä oli hyvät ohjeet siitä, miten muodostaa yhteys tietokantaan, ja kyselyiden esimerkkejä. Sovelluksessa pyrin käyttämään monia SEDNAn ominaisuuksia, joista voi olla hyötyä. Sovelluksen ohjelmointi sujui hyvin, ja se toimi niin kuin oli tarkoituskin. Avainsanat: XML, W3C, SQL, API, XQuery, XPath, DTD, skeema, DBMS

Mellersta Österbottens yrkeshögskola Utbildningsprogrammet för Informationsteknik SAMMANFATTNING Författare: Kennet Tast Arbetets namn: XML-databas tillämpning Datum: 20.1.2008 Sidantal: 35 + 4 bilagor Övervakare: Handledare: Ville Hietala Dipl. Ing. Mats Albäck Lärdomsprovets syfte var att göra en XML-databastillämpning och att studera XML-databasens funktion och användning från ett program. Programmet gjordes med Borland C++ Builder 6.0 programmeringsverktyg och som databas användes SEDNA XML-databas. Arbetet började med att forska XML-teknik och dess betydelse i informationsförmedling. För behandling av XML-dokumentens datainnehåll, används många olika tekniker och sätt. Äldre tekniken som är i användning än i dag är DTD som definierar datagranskningen i XML-dokumenten. För att DTD:s egenskaper räckte inte till en mer invecklad och bredare behandling av XML-dokumentens datainnehåll, utvecklades XML-skema som erbjuder bättre databehandlingsstandarder än DTD. Olika XML-databaser forskades som möjligtvis skulle användas av programmet. Sökandet började från W3C XQuery-testsidan, var olika XML-databasers förmåga av sökspråkets användning finns testade. Meningen var att använda en databas som är gratis även i kommersiella program och att den skulle ha programmeringsskikt åt C/C++, var valet lätt. Valet blev SEDNA XML DATABASE SYSTEMS som uppfyllde kraven och kom med goda instruktioner. Programmeringen började med forskning av programmeringsskikt som kom med SEDNA. Där fanns goda instruktioner att hur man tar kontakt med SEDNA databas och söker information. I tillämpningen användes så mycket som möjligt nyttiga SEDNA egenskaper som man kan ha nytta av. Programmeringen av tillämpningen lyckades bra och den fungerade som den skulle. Nyckelord: XML, W3C, SQL, API, XQuery, XPath, DTD, skema, DBMS

CENTRAL OSTROBOTHNIA UNIVERSITY OF APPLIED SCIENCES Degree Programme in Information Technology ABSTRACT Author: Kennet Tast Name of thesis: A XML-Database Application Date: 20.1.2008 Pages: 35 + 4 Appendices Instructor: Supervisor: Ville Hietala Mats Albäck The purpose of the Bachelor s thesis was to make an XML-database software and to study the operation and the use of the XML-database. The application was made with Borland C++ Builder 6.0 and SEDNA was used as the XML-database. At first, the XML-technique and its meaning in transferring information was studied For handling of the XML-document s data many different techniques are used. The older technique that is still in use is DTD, which defines the validation of data that appears in XML-documents. Because the DTD did not have enough features, a new technique was invented. It was called XML-Scheme and it offered better ways of validating XML-data. In the thesis different XML-databases were studied which possibly could be used with the application. The search was started from W3C XQuery web page where different XML-databases had been tested. Because the purpose was to find an XML-database which was free to be used in a commercial application, the choice was SEDNA XML DATABE SYSTEM. It had also very good programming instructions. Developing of the application began by studying the instructions for the Advanced Programming Interface (API). There were good instructions of how to establish a connection with the SEDNA database, also very good examples of how to run queries against the database. In the application many useful SEDNA functions were used which could be important for the future. The programming of the software succeeded well and it functioned as it should. Key words: XML, W3C, SQL, API, XQuery, XPath, DTD, Schema, DBMS

SISÄLTÖ 1 Johdanto 1 2 XML 2 2.1 XML 2 2.2 DTD 3 2.3 Skeema 4 2.4 Infoset 6 3 KYSELYKIELET 7 3.1 XML-kyselyt 7 3.2 XPath 7 3.3 XQuery 10 4 XML-TIETOKANTA 16 4.1 XML-tietokannan tarkoitus 16 4.2 XML-tietokannan ominaisuudet 17 5 XML-TIETOKANNAN VALINTA 18 5.1 Eri XML-tietokantoja 18 5.2 XML-tietokanta SEDNA 18 5.3 SEDNAN ominaisuudet 19 5.4 SEDNAN arkkitehtuuri 20 5.4 SEDNAN datan organisointi 21 6 XML-TIETOKANTASOVELLUS 25 6.1 Sovelluksen kuvaus 25 6.2 SEDNAN liittäminen projektiin 26 6.3 SEDNAN komentojen suorittaminen 27 6.3.1 Yhteyden muodostaminen 27 6.3.2 Transaktiot 28 6.3.3 Kyselyn tiedon palautus 28 6.3.4 Triggerit 29 6.4 XMLCtrl -luokka 30 6.5 Tietokannan muokkaus 31 6.6 XML-dokumenttien ja kokoelmien käsittely 32 6.7 Kyselyt 32 7 POHDINTA 34 LÄHTEET LIITTEET 1/2. Pääikkunan otsikkotiedoston lähdekoodi 2/6. Pääikkunan c-tiedoston lähdekoodi 3/1. XMLCtrl-otsikkotiedoston lähdekoodi 4/11. XMLCtrl-c-tiedoston lähdekood

1 1 JOHDANTO Tehtävänä oli luoda XML-tietokantasovellus ja tutkia XML-tietokannan käyttöä sekä selvittää, minkälaisia tietokantoja on tarjolla ja löytää ilmainen tietokanta, jota käyttää kaupallisissa sovelluksissa. XML-tietokannalla tarkoitetaan, että XMLdokumentti, joka tallennetaan tietokantaan, pysyy koko ajan samanlaisena eli datasisältö ei muutu. Tarkoituksena oli myös tutkia, minkälaisia kyselykieliä on tarjolla ja miten niitä käytetään. Lisäksi tuli perehtyä XML-tietokantojen sisällyttäminen tavallisiin tietosovelluksiin, ei web-ympäristössä. Opinnäytetyössä tutustuttiin kyselykieliin XPath ja XQuery. Tutkiskelun jälkeen tehtävänä oli luoda paikallinen XML-tietokantasovellus, jolla voisi käsitellä tietokantaa tavallisin menetelmin, kuten lisätä, poistaa, päivittää ja kysellä. Informaation paljous varsinkin internetissä hankaloitti aiheen tutkimista. Oli vaikeaa löytää juuri täsmällistä tietoa, koska kaikkea tietoa oli niin paljon saatavilla. Kirjoja ei löytynyt paljon juuri uusimpien kyselykielien tutkimiseen.

2 2 XML 2.1 XML XML (Extensible Markup Language) on kieli, jolla kuvataan tietoa ja joka helpottaa jäsentämään laajoja tietomassoja helpommin. Itse asiassa XML ei ole kieli vaan spesifikaatio merkintä kielen määrittämiseen. (Rusty & Means 2002, 3.) XML-kieli syntyi 90-luvulla. XML:n pääperiaate on, että käyttäjä voi määritellä miten tallentaa melkein minkälaista tietoa tahansa, mitä ohjelmat millä tahansa alustalla voisivat helposti käyttää. (Rusty & Means 2002, 8.) XML-dokumentin sisältö on melkein samanlainen kuin HTML dokumentin; kaikki tieto on elementtien sisällä <text>asd</text>. XML ei kuitenkaan ole mikään HTML-kielen seuraava versio vaan HTML-kieli on tarkoitettu ainoastaan websivujen koodauskieleksi kun taas XML-dokumentti on enemmän tiedon välitykseen tarkoitettu dokumentti. HTML-kielen jälkeen tuli XHTML, joka on HTML-kieli XMLmuodossa. XML-dokumentti on rakenteellinen. (Rusty & Means 2002, 13) XML-dokumentti koostuu tekstistä, usein UTF8-muotoisesta. Sisältö on kirjoitettu sulkujen sisälle, kuten HTML-koodi myös. Dokumentin sisältö noudattaa puurakennetta. Esimerkki XML-dokumentista: <?xml version="1.0" encoding="utf-8"?> <Henkilöt> <Henkilö> <Nimi>Pekka Puupää</Nimi> <Puh>06-345231</Puh> </Henkilö> </Henkilöt> XML-dokumentti on rakenteeltaan erittäin selvä, ja lukija käsittää heti, miten dokumentti ja sen sisältö on rakennettu.

3 2.2 DTD DTD (Document Type Definition) on määritys mm. XML-dokumentissa käytetystä rakennemäärittelytavasta. DTD määrittelee sallitut muodot elementeille ja attribuuteille, ja tämän seurauksena muodostuu uusi merkintäkieli. (Rusty & Means 2002, 27.) DTD kehitettiin jo kauan ennen XML:ää, joten sen soveltuvuus XML-kieleen on rajattu. DTD:llä pystytään määrittämään, millaisia elementtejä tai attribuutteja kukin elementti saa sisältää ja missä järjestyksessä. Myös keskinäisiä suhteita elementtien ja attribuuttien välillä voidaan määritellä. Rajallisesti voidaan myös määritellä hyväksyttäviä arvoja elementeille ja attribuuteille. (Rusty & Means 2002, 27.) DTD:tä käytetään esimerkiksi kun halutaan, että eri käyttäjien välillä pysyy samanlainen tiedon sisältö. Lisäksi sillä voidaan varmistaa, että ulkopuolelta tuleva data on oikein muotoiltu ja tarkoitukseen sopiva. Myös omaa tietoa voidaan tarkistaa että se on oikein. (Rusty & Means 2002, 28.) DTD ei kuitenkaan tue uusia XML-ominaisuuksia, datasisällön tarkistusta, tietotyyppejä ja oliopohjaista hierarkiaa. Nämä ominaisuudet on otettu huomioon XMLskeemassa. (Rusty & Means 2002, 28.) Esimerkki XML- ja DTD -tiedostosta: XML-tiedosto: <?xml version="1.0" encoding="utf-8"?> <!DOCTYPE Henkilöt SYSTEM "c:\xml.dtd"> <Henkilöt> <Henkilö> <Nimi>Pekka Puupää</Nimi> <Puh>06-345231</Puh> </Henkilö> </Henkilöt> DTD-tiedosto: <?xml version="1.0" encoding="utf-8"?> <!ELEMENT Puh (#PCDATA)>

4 <!ELEMENT Nimi (#PCDATA)> <!ELEMENT Henkilöt ((Henkilö))> <!ELEMENT Henkilö ((Nimi, Puh))> Jos käytetään DTD-määrittelyä XML-dokumentissa, niin XML-dokumenttiin kuuluu laittaa tiedot DTD-tiedostosta dokumentin alkuun kuten XML-dokumentti esimerkissä. DOCTYPE määrittää, missä DTD-tiedosto sijaitsee. DTD-määritys voi olla myös XML-tiedostossa. Esim. <!DOCTYPE Henkilöt SYSTEM "c:\xml.dtd">. ELEMENT Puh (#PCDATA) määrittää <Puh>-elementin sisällön parseroitavaksi tiedoksi. ELEMENT Henkilöt((Henkilö)) määrittää, että elementti <Henkilöt> sisältää lapsi elementin <Henkilö>. ELEMENT Henkilö ((Nimi, Puh)) määrittää, että <Henkilö>-elementti sisältää elementit <Nimi> ja <Puh>. 2.3 Skeema Skeema luotiin DTD:n jälkeen vastaamaan paremmin XML:n vaatimuksiin. Skeeman vaikuttavin parannus DTD:hen on nimiavaruustuki, joka mahdollistaa eri nimiavaruuksien käytön. Skeeman avulla muodostetaan tiedon kanssa XMLdokumentti; tämä on dynaaminen tapa. Katso Kuvio 1. (Rusty & Means 2002, 254.) Skeema voi myös olla kokoelma XML-dokumentteja tai osa toista XMLdokumenttia. Skeema voi myös rajata jonkin tietyn arvon, esimerkiksi elementti <osake määrä> voidaan rajata 0 10, jolloin muita arvoja ei hyväksytä. (Rusty & Means 2002, 254.)

5 Nimiavaruuksien hyöty on siinä, että voidaan valita eri tilanteiden mukaan validointiin käytettävää skeemaa, katso Kuvio 2. Nimiavaruuden muu hyöty on se, että voidaan samassa dokumentissa käyttää eri skeemoissa määriteltyjä tietotyyppejä. XML-skeema Data Dokumentin generointi XMLdokumentti KUVIO 1. XML-dokumentin muodostaminen XMLdokumentti Parseri Validi Data XML-skeema Ei validi Datan hylkäys KUVIO 2. Datan muodostaminen XML-dokumentti: <?xml version="1.0" encoding="utf-8"?> <Henkilöt xmlns:xsi="http://www.w3.org/2001/xmlschema-instance" xsi:nonamespaceschemalocation="c:\xmlschem.xsd"> <Henkilö> <Nimi>Pekka Puupää</Nimi> <Puh>06-345231</Puh> </Henkilö> </Henkilöt> Skeema-dokumentti: <?xml version="1.0" encoding="utf-8"?> <xs:schema xmlns:xs="http://www.w3.org/2001/xmlschema">

6 <xs:element name="puh"> <xs:simpletype> <xs:restriction base="xs:string"> <xs:enumeration value="06-345231"/> </xs:restriction> </xs:simpletype> </xs:element> <xs:element name="nimi"> <xs:simpletype> <xs:restriction base="xs:string"> <xs:enumeration value="pekka Puupää"/> </xs:restriction> </xs:simpletype> </xs:element> <xs:element name="henkilöt"> <xs:complextype> <xs:sequence> <xs:element ref="henkilö"/> </xs:sequence> </xs:complextype> </xs:element> <xs:element name="henkilö"> <xs:complextype> <xs:sequence> <xs:element ref="nimi"/> <xs:element ref="puh"/> </xs:sequence> </xs:complextype> </xs:element> </xs:schema> 2.4 Infoset Infoset sisältää osan XML-dokumentista saatavasta tiedosta ja tietoja suhteista toisiinsa. Infoset välittää ainoastaan informaatiosta, joka on XML-dokumentissa eikä XML-syntakseissa, ja se kuvaa elementtien suhteita lapsialkioihin ja sitä mitä ne ovat. Se myös kertoo, ovatko lapsialkiot esimerkiksi merkkialkioita. (Tobin & Cowan 2004. )

7 3 KYSELYKIELET 3.1 XML-kyselyt XML-kyselytekniikkaa voidaan verrata tavallisissa tietokantasovelluksissa käytettävään SQL-kieleen. XML:n käyttö on kasvanut koko ajan, ja myös itse XMLdokumentit ovat kasvaneet suuriin mittoihin. Nykyään voidaan jo kuvata koko tietokanta XML-dokumentissa, ja se juuri on lisännyt tarvetta omalle kyselykielelle XML-tekniikkaan. Ennen kuin kyselykieliä ei vielä ollut, jouduttiin tiettyä informaatiota hakemaan XML-dokumentista rivi kerrallaan -periaatteella. DOM-komponentteja käytettiin ohjelmistopuolella tähän tehtävään, mutta siellä tuli raja vastaan, koska ne eivät pysty käsittelemään oikein suuria tiedostoja. XPath on yksi vähän vanhempi kyselykieli XML-tekniikkaan, ja se perustuu polkuihin, kuten nimi antaa olettaa. Uusin ja myös paras on XQuery, joka on verrattavissa SQL-kieleen. Sillä voi tehdä tekstikyselyitä, mikä tarkoittaa sitä, että voidaan vaikka etsiä sanaa kissa XML-dokumentista. 3.2 XPath XPath (XML Path Langauge) on kyselykieli XML-dokumenttien tiedon hankkimiseen, ja se luotiin vuonna 1999 (versio 1.0). XPath-versiota on kaksi, 1.0 ja 2.0, joista 2.0 luotiin vuonna 2006. XPath on W3C-standardi, ja sen päätarkoitus on osoittaa osa XML-dokumentista polkujen avulla, mutta se myös tarjoaa mahdollisuuden muokata merkkijonoja, numeroita, totuusarvoja ja lisäksi päivämäärävertailuja. XPath sisältää yli 100 sisään rakennettua funktiota. (Melton & Buxton 2006, 154-170.) XPath 2.0 on parannettu versio 1.0:sta. Se sisältää enemmän funktioita ja on paljon edistyneempi kuin 1.0. Suurin ero on se että 2.0 tukee rikkaampaa tyyppijärjestelmää. Atomic-tyypit ovat tuettuina kuten XML-skeemassa, ja sillä voidaan

8 myös importoida käyttäjän omia laatimia tyyppejä skeemasta. Arvot ovat muuttuneet sekvensseiksi. Alkiokokoelmat on korvattu alkiosekvensseillä, jotka voivat olla missä tahansa järjestyksessä. (Melton & Buxton 2006, 154-170.) Versiossa 2.0 voidaan käyttää nyt for -lauseketta kyselyissä, mikä on ollut edistyneempien kyselykielien ominaisuus. XPath:lla ei voi suoraan päivittää XMLdokumentin dataa, mikä on suuri puute varsinkin XML-tietokannoissa. Tiedon päivittämiseen käyttäjä joutuu käyttämään jotain XML-parseria kuten esimerkiksi DOM:ää ja lataamaan ensin XML-dokumentin parseriin ja siellä päivittämään datan ja sen jälkeen lähettämään XML-dokumentin takaisin XML-tietokantaan. (Melton & Buxton. 2006, 154-170.) XPath:ssa on seitsemän erilaista alkiota. elementti attribuutti teksti nimiavaruus prosessointiohje kommentti dokumentin juurialkio TAULUKKO 1. XPath -käskyt Ilmaisu Kuvaus alkion nimi Valitsee kaikki lapsialkiot nimetystä alkiosta. / Valitsee juurialkion. // Valitsevat alkiot, ihan sama missä ne sijaitsevat.. Valitsee tämänhetkisen alkion... Valitsee tämänhetkisen alkion isän. @ Valitsee attribuutin

9 Esimerkki ilmaisujen käytöstä alla olevaan XML-tiedostoon: <?xml version="1.0" encoding="utf-8"?> <Henkilöt> <Henkilö> <Nimi>Pekka Puupää</Nimi> <Puh>06-345231</Puh> <Ikä>35</Ikä> </Henkilö> </Henkilöt> Henkilöt Valitsee kaikki lapsialkiot <Henkilöt>-alkiosta. /Henkilöt Valitsee juurialkion <Henkilöt>. Henkilöt/Henkilö Valitsee kaikki <Henkilö>-elementit jotka ovat <Henkilöt>alkion lapsia. //Henkilö Valitsee kaikki <Henkilö>-elementit riippumatta siitä missä ne sijaitsevat. Henkilöt//Henkilö Valitsee <Henkilö>-elementit, jotka ovat <Henkilöt>-elementin lapsia riippumatta siitä missä ne ovat <Henkilö>-elementissä. @Nimi Valitsee kaikki attribuutit, joiden nimi on <Nimi>. Predikaatit: Predikaatteja käytetään että löydettäisiin tietty alkio tai alkio, joka sisältää tietyn arvon. Henkilöt/Henkilö[0] Valitsee ensimmäisen <Henkilö>-elementin, joka on <Henkilöt>-elementin lapsi. Henkilöt/Henkilö[last()-1] Valitsee toiseksi viimeisen <Henkilö>-elementin, joka on <Henkilöt>-elementin lapsi. Henkilöt/Henkilö[position<3] Valitsee kaksi ensimmäistä <Henkilö>-elementtiä jotka ovat Henkilöt elementin lapsia. //Henkilö[@Nimi] Valitsee kaikki <Henkilö>-elementit, joissa on attribuutti <Nimi>. //Henkilö[@Nimi = Pekka ] Valitsee kaikki <Henkilö>-elementit joissa on attribuutti <Nimi> ja jonka arvo on Pekka. //Henkilö[@Ikä > 25] Valitsee kaikki <Henkilö>-elementit, joissa on attribuutti <Ikä> ja jonka arvo on suurempi kuin 25.

10 //Henkilö[@Ikä > 25]/Nimi Valitsee kaikki <Nimi> attribuutit joissa attribuutti <Ikä> on suurempi kuin 25. XPath:ssa voidaan myös etsiä elementtejä tai attribuutteja, joiden nimet eivät ole tiedossa. * sopii kaikkiin elementteihin, @* sopii kaikkiin attribuutteihin ja node() sopii kaikenlaisiin alkioihin. Esimerkiksi //* valitsee kaikki dokumentin elementit ja //Nimi[@*] valitsee kaikki <Nimi> -elementit joilla on joku attribuutti. Monien polkujen valinta onnistuu myös käyttämällä pystyviivaa esimerkiksi //Henkilö/Nimi //Henkilö/Ikä valitsee kaikki <Henkilö> -elementin <Nimi> - elementit ja <Henkilö> -elementin <Ikä> -elementit. XPath tuntee myös operaattorit suurempi, pienempi, yhtä suuri, suurempi tai yhtä suuri, pienempi tai yhtä pieni ja eri suuri. Myös lisäys-, vähennys-, kerto-, jako- ja MOD -laskut onnistuvat. XPath palauttaa joko merkkijonon, numeron, totuusarvon tai alkiokokoelman. (Melton & Buxton. 2006, 170.) Merkkijono funktioita on myös mukana: string(object) joka muuntaa annetun objektin merkkijonoksi. concat(string,string,string*) liittää yhteen kaksi merkkijonoa. contains(string1,string2) vertailee että sisältääkö string1 string2:sen. normalize-space(string) kaikki alussa ja lopussa olevat tyhjät merkit poistetaan ja useat tyhjät peräkkäiset merkit muunnetaan yhdeksi. (Melton & Buxton. 2006, 170.) 3.3 XQuery XQuery kehitettiin vastaamaan paremmin XML-dokumenttien tiedon hankinnan vaatimuksia. XQuery on kehitetty vastaamaan helposti omaksuttavista käskyistä, joita on helppo ymmärtää, ja sillä pystyy helposti hakemaan tietoa dokumenteista kuten myös tietokannoista. (Melton & Buxton 2006.)

11 XQuery-kieltä useasti selitetään, siten että se vastaa samaa kuin mitä SQL on tietokanta-tauluille. XQuery-versioita on kaksi, 1.0 ja 2.0. Versio 1.0 on jatkoversio XPath 2.0:sta. XQuery on peritty XML-kyselykielestä Quilt, joka on puolestaan perinyt ominaisuuksia monista eri kielistä, esimerkiksi seuraavista: XPath 1.0, XQL, XML-QL, SQL ja OQL. XQuery on W3C-standardi. Nykypäivänä suret tietokannat tukevat XQery-kielen käyttöä tiedon haussa, kuten esimerkiksi Microsoft, IBM ja Oracle. XQuery operoi XML-dokumentin abstraktissa loogisessa struktuurissa eikä pintasyntaksissa. Tätä loogista struktuuria kutsutaan tietomalliksi (data model). XQery on niin samanlainen kuin XPath 2.0, että molemmat palauttavat samat tulokset kyselyä tehtäessä. (Melton & Buxton 2006.) XQueryn mielenkiintoinen ominaisuus on, että käyttäjä voi tehdä omia funktioita, joita hyödyntää kyselyissä (XQuery Tutorial. XQuery Functions). XQuery sisältää ominaisuudet, joilla voi muokata dataa, joka sijaitsee XML-tietokannassa, esimerkiksi Update, Delete ja Insert. Esimerkki: for $x in doc("henkilöt.xml")/henkilöt/henkilö where $x/ikä>30 order by $x/nimi return $x/nimi Kyseinen esimerkki valitsee henkilöt, joiden ikä on suurempi kuin 30 ja palauttaa henkilöiden nimet Henkilöt.xml-tiedostosta. for-lause valitsee kaikki <Henkilö>-elementit ja sijoittaa ne muuttujaan $x; for on iteraattori. Where-lause valitsee ainoastaan <Henkilö>-elementit, joissa ikäarvo on suurempi kuin 30. Order by -lause määrittelee lajittelujärjestyksen, ja tässä tapauksessa järjestetään nimen mukaan. Return-lause määrittelee, mitä palautetaan. Nimi-arvot palautetaan tässä tapauksessa.

12 for -lausekkeeseen voidaan lisätä myös määritelmiä, kuten to, at ja let. for lausekkeeseen voidaan myös asettaa pilkkuerotin, jolloin voidaan käyttää kaksi hakuehtoa. to-lause määrittää iterointi määrän ja at laskee iterointienmäärän. let määritelmä mahdollistaa muuttujien määritelmän eikä suorita samaa käskyä monta kertaa; let lauseke ei iteroi. in-esimerkki: for $x in (1 to 5) return <test>{$x}</test> Esimerkki iteroi korkeintaan viisi kertaa, vaikka tuloksia olisi enemmän. Tulos: <test>1</test> <test>2</test> <test>3</test> <test>4</test> <test>5</test> at-esimerkki: for $x at $i in doc("henkilöt.xml")/henkilöt/henkilö/nimi return <Henkilö>{$i}. {data($x)}</henkilö> Tulos: < Henkilö >1. Pekka Puupää</Henkilö > < Henkilö >2. Harri Puu</Henkilö > < Henkilö >3. Seppo Monttu</Henkilö > < Henkilö >4. Liisa Leipuri</Henkilö > let-esimerkki: let $x := (1 to 5) return <test>{$x}</test> Tulos: <test>1 2 3 4 5</test> XQuery on erittäin kätevä, jos esimerkiksi halutaan näyttää tulokset HTML-sivulla. Kyselyyn lisätään vain HTML-tagit, ja kysely palauttaa valmiin HTML-sivun.

13 Esimerkki palauttaa kyselyn tulokset HTML-listassa: <ul> { for $x in doc("henkilöt.xml")/henkilöt/henkilö/nimi order by $x return <li>{$x}</li> } </ul> Jos halutaan palautus pelkkänä datana eikä data tagien sisällä, niin voidaan käyttää data($x)-käskyä. Esimerkki: <ul> { for $x in doc("henkilöt.xml")/henkilöt/henkilö/nimi order by $x return <li>{data($x)}</li> } </ul> Peruskäskysäännöt: XQuery on case-sensitive XQuery:n elementit, attribuutit ja muuttujien on oltava valideja XML-nimiä. XQuery-merkkijonoarvo voi olla -merkkien tai -merkkien sisällä. XQery-muuttuja on määritelty $-merkillä, jonka jälkeen tulee nimi. XQery-kommentit ovat :-merkkien sisällä, esim. :kommentti: XQuery:ssä voi myös käyttää if-else-then, ehtomäärittelyä. for $x in doc("henkilöt.xml")/henkilöt/henkilö return if ($x/@ikä<18) then <lapsi>{data($x/nimi)}</lapsi> else <aikuinen>{data($x/nimi)}</aikuinen> Funktioden käyttäminen tapahtuu yleensä liittämällä fn sana funktion nimen eteen, kuten fn:string(). Tämä ei ole pakollista, koska fn on oletuksena nimiavaruuden prefiksi joten, fn sanaa ei tarvita.

14 TAULUKKO 2. Funktiot Käyttö kohde Funktio Esimerkki Elementti uppercase() <nimi>{uppercase($nimi)}</nimi> Polku substring() doc("henkilöt.xml")/henkilöt/henkilö[substrin g(nimi,1,5)='harri'] let-lause substring() let $nimi := (substring($henkilönnimi,1,4)) Oman funktion kirjoittaminen onnistuu myös kirjoittamalla funktio kyselyyn tai erilliseen kirjastoon. Oman funktion ehdot: Käytä declare-funktiosanaa. Funktion nimen on oltava prefiksoitu. Parametrien datatyypit ovat enimmäkseen samoja kuin XML-skeemassa on määritelty. Funktion on oltava kehystetty {}-merkeillä. Syntaksi: declare function prefix:funktion_nimi($parameter AS datatype) AS returndatatype { (:...funktion koodi... :) }; Esimerkki oman funktion toteuttamisesta kyselyssä: declare function local:minprice( $price as xs:decimal?, $discount as xs:decimal?) AS xs:decimal? { let $disc := ($price * $discount) div 100 return ($price - $disc) }; Funktion kutsuminen: <minprice>{local:minprice($book/price, $book/discount)}</minprice>

15 Tiedon lisäämisessä dokumenttiin voidaan käyttää kolmea eri sijoituskäskyä, into,preceding tai following. Seuraavassa on esimerkki insert-käskystä: UPDATE insert <Person id="4"> <Name>Laila Torvi</Name> <Age>44</Age> <Tel>07-232223</Tel> </Person> following doc("persons.xml", Person )/Persons

16 4 XML-TIETOKANTA XML-tietokannalla tarkoitetaan tietovarastoa, joka sisältää XML-muotoista dataa. Ne määrittävät loogisen mallin XML-dokumenteille, jotka varastoidaan tai noudetaan XML-tietokannasta. Vertailuna voidaan käyttää relaatiotietokantoja, jotka säilyttävät datan taulun riveissä, XML-tietokantojen kantoihin tallennetaan XMLdokumentti/-dokumentteja. XML-tietokantojen päätarkoitus on olla työväline XML-dokumenttien käsittelyssä ja tallennuksessa. Niiden tarkoitus ei ole korvata relaatiotietokantoja. Nykypäivän relaatiotietokannat tukevat myös XML-tiedon tallentamista ja kyselyä. XMLtietokantoja on kahden tyyppisiä, niitä, jotka tallentavat tiedon binäärisenä, ja niitä, jotka tallentavat sen XML-dokumentin muodossa. (Staken 2001.). 4.1 XML-tietokannan tarkoitus Koska maailmassa alkaa olla paljon XML-dokumenttien käsittelyä varsinkin internetympäristössä ja dokumentteja pitäisi pystyä tallentamaan jonnekin, esimerkiksi tietokantaan, niin huomattiin, että relaatiotietokannat ja muut sen hetkiset tietokannat eivät oikein hyvin sopineet siihen tehtävään. Relaatiotietokantoihin kehiteltiin XML-tiedon käsittely-, ja tallennusmekanismeja mutta myös XML-tietokantoja kehiteltiin käsittelemään pelkkiä XML-tietoja. XML-tietokantojen tarkoitus on antaa suora tuki XML-datan tallennukseen. Jos esimerkiksi tallentaisimme XML-dataa relaatiotietokantaan, kuten nykypäivänä on mahdollista, joutuisi XML-datan ensiksi hajottamaan taulujen riveihin ja sarakkeisiin, ja jos datan haluaa ulos relaatiotietokannasta, joutuisi datan ensiksi hakemaan taulujen riveistä ja sarakkeista ja sijoittamaan XML-dokumenttiin. Kyseinen operaatio on aikaa vievää.

17 Myös se, että jotkin XML-tietokannat pystyvät hakemaan alkuperäisen XMLdokumentin tietokannasta, on hyvä ominaisuus esimerkiksi lakiasioissa, joissa vaatimuksena on, että dokumentti on alkuperäinen. (Bourret 2005.) Koska XML-tietokannoissa ei tarvitse muunnella dataa edestakaisin on tämän operointi nopeampaa ja tehokkaampaa. Samasta syystä XML-tietokantojen väitetään säästävän sovelluskehitysaikaa ja vähentävän ohjelmoinnin monimutkaisuutta. (Bourret 2005.) 4.2 XML-tietokannan ominaisuudet Kaikki XML-tietokannat eivät ole samanlaisia, mutta niillä kaikilla on yhteisiä ominaisuuksia, kuten datan käsittely, kokoelmat, kyselyt ja päivitykset. Datan käsittely on erilaista kuin relaatiotietokannoissa. Data on tallennettuna XML-muotoon, ja se ei sijaitse tauluissa, taulun riveissä tai taulun sarakkeissa kuten relaatiotietokannoissa. XML-tietokantaan on myös tallennettu XML-datan rakenne, jota hyödynnetään dataa haettaessa tai tallennettaessa. Vaikka käytettäisiin relaatiotietokantaa, jossa on XML-datan tallennusmahdollisuudet, ei SQL:n käyttö olisi yhtä yksinkertaista, kuten se on normaalien taulujen datan käsittelyssä, koska XML-data sisältää myös tiedot XML-datan rakenteesta. (Bourret 2005.) Kokoelmia käytetään, jos halutaan, että kysely ulottuisi moneen XML-dokumenttiin samalla kerralla. Eräät XML-tietokannat eivät vaadi skeemaa XML-dokumenttien tallennukseen, ja siinä tapauksessa tietokantaan voidaan tallentaa minkälaisia XML-dokumentteja tahansa. Skeemasta riippumattomuus tekee XMLtietokannasta joustavamman ja sovelluskehityksestä helpomman, mutta se vaarantaa tiedon eheyden. (Bourret 2005.) XQuery ja XPath ovat nykyään jo tuettuja kyselykieliä XML-tietokannoissa. XQuery:ä voidaan verrata SQL-kieleen, ja sillä voidaan tehdä kaikki tärkeämmät operaatiot XML-datan suhteen, eli datan lisäys, poisto ja päivittäminen onnistuvat, mikä ennen XQueryä ei ollut mahdollista. Kyselyiden suorituskykyä voidaan parantaa luomalla indeksejä tietokantaan. (Bourret 2005.)

18 5 XML-TIETOKANNAN VALINTA XML-tietokantaa valittaessa oli ehtona se, että se olisi ilmainen ja lisenssi sallisi käytön kaupallisessa sovelluksessa. Myös ohjelmointirajapinnan saanti C++ Builder -sovelluskehitystyökalulle olisi hyvä, koska sillä teen kyseisen sovelluksen. 5.1 Eri XML-tietokantoja Nykyään on tarjolla monenlaisia XML-tietokantoja, maksullisia ja open source - lisenssiin perustuvia mutta myös täysin ilmaisia. Kaikissa on poikkeavia ominaisuuksia, ja varsinkaan sovellusrajapintoja ei ole tarjolla kaikille ohjelmointi-kielille, mutta eräät tarjoajat ovat ratkaisseet asian tekemällä niin kutsutun Client/Serverominaisuuden, jolloin pystytään käyttämään omaa ohjelmointi-työkalua riippumatta siitä, onko ohjelmointirajapintaa. Yleisin ohjelmointirajapinta, joka löytyy melkein kaikista, on Javalle tarkoitettu. W3C XQuery -testisivulta löysin seuraavat testatut tietokannat: BaseX ei tarjoa ohjelmointi-api:a Berkeley DB XML Open Source, ilmainen jos julkaistaan oma ohjelma koodi exist-db internetympäristöön. Saxon-SA maksullinen Sedna XML Database System ilmainen X-Hive/DB maksullinen XQuantum maksullinen Valitsin SEDNA-tietokannan, koska se oli ilmainen ja siitä löytyi tuki XQuerykysely-kielelle. Myös ohjelmointirajapinta C/C++-kielelle vaikutti valintaan. Ohjeetkin olivat erittäin hyviä. 5.2 XML-tietokanta SEDNA SEDNA XML-tietokannan on kehittänyt venäläinen MODIS-ryhmä ISP RAS (Institute for System Programming, ISP, Russian Academy of Sciences, RAS). Uusin versio SEDNA 2.2 julkaistiin 23.10.2007, ja sen kehitys alkoi vuoden 2003 alussa.

19 SEDNA on suunniteltu XQuery-kysely-kielen käyttöä ajatellen. (Grinev & Fomichev & Kuznetsov 2004.) SEDNA suunniteltiin pitäen mielessä kaksi tärkeintä tavoitetta: Sen tuli olla täydellinen tietokantajärjestelmä, joka tarjoaa tavallisten tietokantojen palvelut, kuten ulkoisen muistinhallinnan, kysely- ja päivitysominaisuudet, samanaikaisuuden hallinnan, kyselyn optimoinnin jne. Lisäksi sen tuli tarjota ajon aikainen ympäristö XML-datan sovelluksille. (Grinev & Fomichev & Kuznetsov 2004.) SEDNA on ilmainen XML-tietokanta ja suunniteltu yleiseksi kannaksi monille XMLsovelluksille. SEDNA on rakennettu ihan alusta alkaen nopeaksi ja luotettavaksi tallennusvarastoksi ja suuria datamääriä prosessoimaan. SEDNA on täysi tietokantajärjestelmä joka tarjoaa täydelliset tietokantaominaisuudet, kuten kyselyt, päivitykset, transaktiot, elpymisen ja turvallisuuden. (Grinev & Fomichev & Kuznetsov 2004.) 5.3 SEDNAN ominaisuudet SEDNA on avoimeen lähdekoodin perustuva XML-tietokantajärjestelmä, joka on implementoitu C/C++:lla. Lisäksi voidaan käyttää myös Apache-moduulia mutta se noudattaa Apache-lisenssiä 2.0. XQuery-kielen tuki on yksi tärkeimmistä ominaisuuksista, ja se on varmennettu W3C XQuery Test Suite -testissä. (Native XML Database System.) Ominaisuuksiin kuuluu myös täysi tekstihaku, joka perustuu dtsearch-ohjelmaan, joka on maksullinen. SEDNAn tallennusstruktuuri on suunniteltu tehokkaaksi avuksi kyselyihin ja päivityksiin. SEDNA-systeemi ei sisällä alla olevaa relaatiotietokantaa tai muuta vastaavaa. Tallennus perustuu kuvaavaan skeemaan, joka on datasta peritty ja jota kutsutaan DataGuideksi. (Native XML Database System.) SEDNA ei välitä dokumenttien koosta, joten sillä on tehokas tuki kokoelmiin tai ihan yksittäisille dokumenteillekin. Transaktioita voi myös käyttää kuten myös triggereitä, ja tietokannan voi indeksoida, mikä nopeuttaa tiedon hakemista.

20 Tietokantaan saa myös määriteltyä turvallisuusasetuksia käyttäjille. SQL-yhteys on mahdollista XQuery:n kautta. (Native XML Database System.) Ohjelmointirajapintoja on seuraaville kielille: Java, C-kieli, Scheme, PHP, Python,.NET ja OmniMark. Myös muille kielille onnistuu implementointi open socket-base client/server -protokollan avulla. (Native XML Database System.) SEDNA on suunniteltu ja implementoitu siirrettäväksi eri järjestelmiin. Tällä hetkellä SEDNA on saatavissa seuraaville järjestelmille: Windows 2000/XP Linux x86 kernel versio 2.4 tai uudempi PowerPC IBM RS6000, Debian Sarge. (Native XML Database System.) 5.4 SEDNAN arkkitehtuuri SEDNA DBMS (DataBase Management System) sisältää seuraavat komponentit: governor on koko järjestelmän keskusyksikkö. Kaikki muut komponentit rekisteröityvät governoriin. Governor tietää, mitkä tietokannat ja transaktiot ovat ajossa ja kontrolloi niitä. listener luo instanssin yhteyskomponentista jokaista asiakasta kohden ja asettaa suoran yhteyden asiakkaan ja yhteyskomponentin väliin. Yhteyskomponentti sisältää asiakkaan session. Se luo instanssin transaktiokomponentista asiakkaan jokaisesta aloita transaktio -pyynnöstä. Katso Kuvio 3. (Grinev & Fomichev & Kuznetsov 2004.)

21 KUVIO 3. SEDNAn rakenne. (Grinev & Fomichev & Kuznetsov 2004.) Transaktio(transaction)komponentti sisältää seuraavat kyselynsuorituskomponentit: parseri (parser), optimoija (optimizer) ja suorittaja (executor). Optimoija ottaa kyselyn loogisen esitelmän ja muodostaa optimoidun kyselysuoritussuunnitelman, joka sisältää alemman tason operointeja fyysisen datan struktuureissa puumuodossa. Suorittaja tulkkaa suoritussuunnitelman. Jokainen instanssi tietokantahallinnasta sulkee yksittäisen tietokannan ja koostuu tietokantahallintapalvelusta siten, että indeksihallinta pitää huolen indekseistä, joita tietokanta sisältää, puskurihallinta on vastuussa levyn ja päämuistin välisestä kommunikoinnista ja transaktiohallinta tarjoaa yhteiset yhteyskontrollivälineet. (Grinev & Fomichev & Kuznetsov 2004.) 5.4 SEDNAN datan organisointi SEDNAn datan organisointiin on käytetty suoria osoittimia esittämään XMLdokumentin alkioiden (isäntä, lapsi ja jälkeläinen) yhteyksiä toisiinsa. SEDNA:ssa

22 on käytetty kuvaavaa skeemaa tallennusstrategiana, joka perustuu alkioiden klusterioinnin sijaintiin XML:n kuvaamassa skeemassa toisin kuin perspektiivisessä skeemassa, joka tiedetään ennakkoon ja on yleensä määritelty DTD:ssä ja XMLskeemassa. Kuvaava skeema luodaan dynaamisesti ja ylläpidetään datasta. Se esittää perusteellisen ja tarkan rakenteellisen yhteenvedon datasta. (Grinev & Fomichev & Kuznetsov 2004.) Kuvaava skeema XML-datalle on aina puumuodossa. Kuvaava skeema on tarkempi, ja se sallii kuvaavan skeeman tallennusstrategia käytön sellaiselle datalle, jolla ei ole skeemaa. Jokainen skeeman alkio on nimetty XML-alkiolapsen tapaan, esimerkiksi elementti, attribuutti ja teksti ja niillä on osoitin datalohkoihin, missä skeeman alkioita vastaavat alkiot ovat tallennettuina. (Grinev & Fomichev & Kuznetsov 2004.) Jotkut skeeman alkiot alkio tyypin mukaan, ovat myös nimettyjä. Data-lohkot, jotka kuuluvat yhteen skeeman alkioiden kanssa, ovat linkitettyinä osoittimilla kaksisuuntaisessa listassa. Alkiokuvailijat lohkolistassa ovat osittain järjestettyjä dokumenttijärjestyksen mukaan, mikä tarkoittaa, että jokainen alkio kuvailija lohko i:ssä edeltää jokaista alkiota lohko j:ssä dokumenttijärjestyksessä, vain, jos i on pienempi kuin j. (Grinev & Fomichev & Kuznetsov 2004.) Lohkon sisällä alkiot eivät ole järjestyksessä, mikä vähentää yleistä dokumenttijärjestyksen järjestelyä päivityksien sattuessa. (Grinev & Fomichev & Kuznetsov 2004.) Tekstiarvo on teksti alkion sisältö tai attribuutin alkion arvo jne. Tekstiarvon tärkein asia on, että se vastaa muuttujan pituutta. Tekstiarvot ovat tallennettuina lohkoihin perustuen hyvin tiedettyjen slotted-page -struktuuri metodeihin. (Grinev & Fomichev & Kuznetsov 2004.) Osoittimien tallentaminen kaikille lapsille alkiokuvauksessa voi johtaa alkiokuvauksen koon ylittymiseen lohkossa. Välttääkseen tämän SEDNA tallentaa

23 ainoastaan osoittimia ensimmäisille kuvaavan skeeman lapsille. Tämä käy ilmi SEDNAn skeemakuvasta, Kuvio 4. (Grinev & Fomichev & Kuznetsov 2004.) KUVIO 4. SEDNA-skeema. (Grinev & Fomichev & Kuznetsov 2004.) Otsikko(label)kenttä sisältää otsikon numeroinnin skeemasta. Vasemman ja oikean lapsiosoittimen merkitys on suoraan eteenpäin. Seuraava lohkossa ja edellisessä lohkossa osoittimet käytetään lohkon sisällä olevien alkioiden linkittämiseen dokumenttijärjestyksen uudelleen konstruoimisen sallimiseen. Seuraava ja edellinen osoitin sallivat uuden dokumenttijärjestyksen konstruoimisen niiden alkioiden kesken, jotka vastaavat samaa skeema-alkiota, jossa lapsi-osoittimia vasen ja oikea käytetään tukemaan dokumentti järjestystä lapsien välissä. Katso kuvio 5. (Grinev & Fomichev & Kuznetsov 2004.)

24 KUVIO 5. Yleisen alkion kuvauksen rakenne. (Grinev & Fomichev & Kuznetsov 2004.)

25 6 XML-TIETOKANTASOVELLUS 6.1 Sovelluksen kuvaus Sovellus ohjelmoidaan C++ Builder 6 -ohjelmointityökalulla. Sovellus sisältää seuraavat ominaisuudet: tietokannan käsittely luominen ja poistaminen kokoelmien käsittely katsominen, poistaminen ja lisääminen dokumenttien käsittely katsominen, poistaminen, lisääminen ja päivittäminen kysely Xquery/XPath-kyselykielen suorittaminen Sovellus perustuu yhteen pääikkunaan jossa käyttäjä voi suorittaa XML-datan muokkaamista ja muuta XML-tietokantaan liittyvää operointia. katso kuvio 6. Itse funktiot, jotka ovat yhteydessä SEDNA:an, tehdään erilliseen luokkatiedostoon, koska täten voidaan helposti siirtää koodi johonkin toisen projektin käyttöön tarvittaessa. Projektiin liitetään libsedna API -kirjasto joka on C++ Builder 6:een tehty ohjelmointirajapinta, jonka sai SEDNAN sivustolta kopioitua. Myös muut tarvittavat SEDNA-paketit saa sivustolta http://modis.ispras.ru/sedna ilmaiseksi. KUVIO 6. Sovellusikkuna

26 6.2 SEDNAN liittäminen projektiin Lisätään projektin asetuksiin polku libsedna_bcb6 kansioon, jotta projekti löytää tarvittavat tiedostot. Katso kuvio 7. KUVIO 7. Kirjaston liittäminen projektiin Projektiin lisätään myös libsedna_bcb.lib-kirjastotiedosto ja libsedna.h-tiedosto sekä myös sp_defs.h. Katso kuvio 8. Tämä kyseinen kirjastotiedosto on tarkoitettu käytettäväksi ainoastaan yksinajosovelluksessa, mutta mukana tulee myös libsednamt-kirjasto joka on tarkoitettu moniajoon. KUVIO 8. Projektitiedostot

27 6.3 SEDNAN komentojen suorittaminen SEDNAn komentoja suoritetaan ohjelmointirajapinnan avulla. Ohjelmointirajapinnasta löytyvät kaikki tarvittavat funktiot tietokannan käsittelyyn. Ennen kuin SEDNA:an luodaan yhteys, on muodostettava SednaConnectionmuuttuja, joka sisältää tietoja SEDNA-yhteydestä. Kuviosta 9 nähdään Sedna- Connection-muuttujan sisältämät tiedot. KUVIO 9. SednaConnectionin sisältämät tiedot 6.3.1 Yhteyden muodostaminen SEDNA-yhteys muodostetaan käyttämällä SEconnect -käskyä. Parametreinä annetaan osoite, missä SEDNA DBMS sijaitsee, tietokannan nimi, käyttäjänimi ja salasana. Käyttäjän salasanoja voidaan muokata. int SEconnect(SednaConnection* conn, const char* url, const char* db_name, const char* login, const char* password)

28 6.3.2 Transaktiot SEDNAn kyselyt suoritetaan aina transaktioina, eli aina ennen kuin kysely ajetaan, suoritetaan transaktion alkukomento. Transaktioita käytetään tiedon perillemenon varmistukseen. Transaktioita voidaan käyttää ainoastaan yhtä kerralla. Sovelluksia ohjelmoitaessa käytetään SBegin(Sedna ConnectionType) -komentoja ennen itse kyselyn suorittamista ja kyselyn onnistumisen jälkeen kuitataan, että kysely onnistui. res = SEbegin(Conn); if(res!= SEDNA_BEGIN_TRANSACTION_SUCCEEDED) { ShowMessage("Begin transaction failed: " + AnsiString(SEgetLastErrorMsg(Conn))); return -1; } res = SEexecute(Conn, q.c_str()); if(res!= SEDNA_QUERY_SUCCEEDED) { ShowMessage("Query failed: " + AnsiString(SEgetLastErrorMsg(Conn))); return -1; } res = SEcommit(Conn); if(res!= SEDNA_COMMIT_TRANSACTION_SUCCEEDED) { ShowMessage("Commit transaction failed: " + AnsiString(SEgetLastErrorMsg(Conn))); SErollback(Conn); return -1; } 6.3.3 Kyselyn tiedon palautus Kysely suoritetaan aina SExecute(ConnectionType, Query text) -komennolla. Kyselyn palautustiedon joutuu iteroimaan palautussekvenssin sisällöstä. Komennolla SEnext(ConnectionType) käyttäjä valitsee seuraavan tiedon. SEget- Data(SednaConnection* conn, char* buf, int bytes_to_read) -komento hakee tiedon buf-muuttujaan.

29 while((res = SEnext(Conn))!= SEDNA_RESULT_END) { if (res == SEDNA_ERROR) { ShowMessage("Failed to get next result item from server: " + AnsiString(SEgetLastErrorMsg(Conn))); return -1; } do { bytes_read = SEgetData(Conn, buf2, 1024-1); if(bytes_read == SEDNA_ERROR) { ShowMessage("Failed to get result data from server: " + AnsiString(SEgetLastErrorMsg(Conn))); return -1; } } if(bytes_read > 0){ buf2[bytes_read] = '\0'; temp= temp + buf2; } }while(bytes_read > 0); 6.3.4 Triggerit Triggerit ovat tapahtuman kuuntelijoita tietokannassa. Kun muutoksia tehdään johonkin dokumenttiin, triggeri havaitsee tapahtuman ja toimii annettujen ohjeiden avulla. Triggerit voidaan yhdistää toimimaan ennen Lisää-, Poista- tai Korvaatapahtumia tai niiden jälkeen. Triggerin pohjimmainen käyttötarkoitus on taata tiedon oikea olemus. Seuraava esimerkki luo uuden triggerin, joka tarkkailee uuden tiedon lisäämistä. Jos henkilön ikä on alle 18 vuotta, lisätään uusi, alkio johon sijoitetaan lapsi-arvo, Jos henkilö on yli tai yhtä kuin 18 vuotta, lisätään uusi alkio johon sijoitetaan aikuinen-arvo. CREATE TRIGGER "tr1" BEFORE INSERT ON doc("persons")//person FOR EACH NODE DO

30 { if($new/age < 18) then <person>{attribute id {$NEW/@id}} {$NEW/*} <age-group>lapsi</age-group> </person> else <person>{attribute id {$NEW/@id}} {$NEW/*} <age-group>aikuinen</age-group> </person>; } 6.4 XMLCtrl-luokka XMLCtrl-luokka on dynaaminen, ja se sisältää kaikki funktiot, mitä käytetään liittyen SEDNAn tietokantaan. Kaikki SEDNAan liittyvät funktiot ovat samassa luokassa sen takia, että jos joskus halutaan siirtää funktiot, niin on huomattavasti helpompaa siirtää koko luokka kuin että niitä joutuisi kopioimaan sieltä täältä, katso kuvio 10. KUVIO 10. XmlCtrl-luokka

31 Otsikkotiedostoon joudutaan sisällyttämään libsedna.h- ja sp_defs.h-tiedostot. Sen jälkeen voidaan luoda luokan xmlctrl konstruktorin. SednaConnection* Conn on osoitin SEDNAn yhteystyyppiin. Tämä osoitin hoitaa kaikki yhteydet tietokantaan. Start/Stop services -funktio käynnistää tai sammuttaa tarvittavat palvelut, joita SEDNA tarvitsee. SEDNAn mukana tulee ajettavia tiedostoja, jotka hoitavat tietokannan yhteyksiä, katso kuvio 11. Tätä kutsutaan SEDNAn SEDNA DBMS (Data- Base Management System). Nämä tiedostot ajetaan yleensä komentokehotteesta. SEDNA DBMS sisältää seuraavat komponentit (ajettavat tiedostot): se_cdb luo uuden tietokannan se_ddb poistaa tietokannan se_exp export/import/restore se_gov käynnistää SEDNAn serverin ja on pakollinen ajaa se_rc näyttä tietoa SEDNAn komponenttien ajosta se_sm ajaa tietokannan se_smsd pysäyttää tietokannan se_stop pysäyttää SEDNAn se_term voidaan suorittaa tietokantafunktioita käskykehotteen kautta KUVIO 11. SEDNAn komponentit 6.5 Tietokannan muokkaus Tietokannan muokkausominaisuudet ovat tietokannan lisäys, poisto ja valitun tietokannan käyttö. Käyttäjä voi lisätä uuden tietokannan valitsemalla Create databse ja poistaa tietokannan valitsemalla Delete database. Poistamiseen käytetään

32 se_ddb.exe-ohjelmaa, joka kuuluu SEDNAn omiin tietokannan hallintasovelluksiin. 6.6 XML-dokumenttien ja kokoelmien käsittely SEDNA-tietokantaan voidaan lisätä XML-dokumentteja joko yksittäisinä tai sitten ne voidaan lisätä johonkin kokoelmaan. Kokoelmassa on se hyöty, että XMLdokumenteissa jotka kuuluvat johonkin kokoelmaan, voidaan suorittaa sama kysely koskemaan kaikkia kokoelmaan kuuluvia dokumentteja. Sovelluksessa voidaan lisätä ja poistaa kokoelmia. Dokumentteja voidaan lisätä johonkin tiettyyn kokoelmaan tai poistaa ne sieltä. Kokoelma listan haku on itse asiassa kysely, joka palauttaa kokoelma listan. for $b in document("$collections")/collections/collection return data($b/@name) Samalla tavalla on myös dokumenttien haku toteutettu. for $b in document("$documents")/documents/collection where $b/@name = [ collection name ] return data($b/document/@name) 6.7 Kyselyt Kyselyitä voidaan suorittaa Query-laatikkoon kirjoittamalla. Laatikon alapuolella on valmiiksi muodostettuja kyselyitä, joita voi käyttää ja muokata. Kyselyitä voi tehdä XPath-, XQuery- ja XUpdate-kielillä. Kuviossa 12 on suoritettu kysely Persons - kokoelmaan ja persons.xml -tiedostoon. Kyselyssä halutaan selvittää olemassa olevat person_id -arvot. Kysely palauttaa tuloksen Document/Query result - kenttään.

KUVIO 12. Kyselyn suoritus 33

34 7 POHDINTA Minulla ei ollut aikaisempaa kokemusta XML-tietokannoista tai XML-kysely-kielien käytöstä. Ainoastaan XML-dokumentit olivat tuttuja. Kun mietin mahdollisuuksia sijoittaa XML-dokumentteja relaatiotietokantaan, löysin sattumalta tietoa XMLtietokannasta ja sen kyselykielenä käytetystä XQuery-kielestä. XML-dokumenttien tai tiettyjen tietojen haussa tietokannasta minua kiinnosti kovasti se miten hyvin XQuery muistuttaa SQL-kieltä ja voidaanko sillä tosiaankin hakea tietoa tekstin perusteella, puhumattakaan tiedon päivittämisestä. Seuraavaksi kiinnosti selvittää hakunopeutta verrattuna relaatiotietokannan hakunopeuteen. Testattuani asiaa huomasin, että ei nopeus mikään huono ole, vaikka kyllä nykypäivän relaatiotietokannat varmasti vähän nopeampia ovatkin. Hakuajat riippuvat paljolti siitä miten on säätänyt asetuksia XML-tietokannassa, koska siinä voi asettaa käyttöön indeksejä, jotka nopeuttavat hakuaikoja huomattavasti. XML-kyselykielien käyttö oli erittäin vierasta minulle, varsinkin XQuery-syntaksin ulkonäkö näytti aluksi sekavalta. Vähäisen käytön jälkeen XQuery vaikutti varsin hyvältä XML-dokumenttien kyselykieleltä. Kieli sisältää paljon käyttömahdollisuuksia. Sovelluksen ohjelmointi sujui hyvin. Ainoastaan SEDNAn C++ Builderille tarkoitettu kirjasto tuotti ongelmia käännettäessä projektia. Ongelman aiheutti vanhentunut otsikkotiedosto, jota vaihtamalla kääntäminen onnistui SEDNAn mukana tuli erittäin hyvät ohjeet, joista oli erittäin suuri apu ohjelmoidessa sovellusta. XMLtietokantasovellus toimii niin kuin oli tarkoituskin. SEDNA XML-tietokannan käyttöönotto ja käyttö olivat helppoa, ja tämän tapaiset tietokannat tulevat varmasti lisääntymään tulevaisuudessa internet-ympäristössä.

35 LÄHTEET Painettu kirja Melton, Jim & Buxton, Stephen. 2006. Querying XML: XQuery, XPath, and SQL/XML in Context. Rusty Harold & W. Scott Means. 2002. XML in a Nutshell: 2nd Edition. USA: O'Reilly & Associates. Sähköinen julkaisu Bourret, Ronald. XML And Databases. WWW-dokumentti. Saatavissa: http://www.rpbourret.com/xml/xmlanddatabases.htm. Muutettu:2005. Luettu: 8.1.2008. Cowan, John & Tobin, Richard. XML Information Set (Secind Edition) W3C Recommendation 4 February 2004. WWW-dokumentti. Saatavissa: http://www.w3.org/tr/xml-infoset/. Muutettu: 2004. Luettu: 2.1.2008. Grinev, Maxim & Fomichev, Andrey & Kuznetsov, Sergey. WWW-dokumentti. Saatavissa: http://www.ispras.ru/~grinev/mypapers/sedna.pdf. Muutettu: 2004. Luettu: 8.1.2008. Native XML Database System. WWW-dokumentti. Saatavissa: http://modis.ispras.ru/sedna. Luettu: 8.1.2008. Staken, Kimbro. Introduction to Native XML Databases. WWW-dokumentti. Saatavissa: http://www.xml.com/pub/a/2001/10/31/nativexmldb.html. Muutettu:2001. Luettu: 6.1.2008. XQuery Tutorial. XQuery Functions. WWW-dokumentti. Saatavissa: http://www.w3schools.com/xquery. Luettu: 4.1.2008.