XML prosessointi Miten XML dokumentteja luetaan ja kirjoitetaan XML prosessori lukee ja välittää XML dokumentin sovellukselle. Se sisältää entieettikäsittelijän (mahdollisesti) XML jäsentimen Sovellus = ohjelma, joka saa XML dokumentin (jossain muodossa) syötteeksi, usein tarkoitetaan XML tietoinen sovellus tunnistaa ja ymmärttää XML esitystavan (sisältää XML prosessorin) XML prosessori Usein ohjelmistokirjasto lukee XML dokumentin ja välittää sen sovellukselle dokumenttikatkelmat (jos useassa tiedostossa) korvaa sisäiset entiteettiviittaukset entiteeteillä voi validoida DTD:tä vastaan (jos jäsennin mukana) voi huomata virheita kuten esim. jos dokumenttiin liittyy esitystapa, jota sovellus ei voi käsitellä, tai url, joka osoittaa ei olemassa olevaan kohtaan, jne. Validoiva jäsennin lukee XML dokumentin tarkistaa onko dokumentti DTD:n mukainen validius hyvinmuodostuneisuus voi myös tarkistaa pelkän hyvinmuodostuneisuuden XML:n kirjoittaminen helpompaa kuin lukeminen sovellus kirjoittaa tunnisteita huolellisuus tyhjien välien kanssa XML prosessorin osa Tapahtumaohjattu käsittely XML dokumenttia käsitellään tietovirtana jokainen osa käsitellään silloin kun se tulee vastaan elementin alkutunniste elementin sisältö elementin lopputunniste jne. jokaisen tällaisen tapahtuman yhteydessä voidaan suorittaa jokin toiminto Tapahtumaohjattu käsittely ei voida viitata dataan, jota ei vielä ole luettu (joka tulee virrassa myöhemmin) voi vaatia että syöte luetaan useampaan kertaan esim. sisällysluettelo: ensimmäisellä kerralla poimitaan lukujen otsikot, toisella kerralla kirjoitetaan luettelo oikeaan paikkaan dokumenttia voidaan yrittää järjestää niin, että sen tapahtumaohjattu käsittely olisi helpompi esim. tietyt marginaaliasetukset ennen itse tekstiä Puukäsittely rakentaa muistiin dokumenttipuun puuta voidaan muokata (ennen tulostusta) käsittelyssä voidaan viitata mihin tahansa osaan esim. sisällysluettelo voidaan koota läpikäymällä puuta ja lisäämällä luettelo oikeaan kohtaan dokumenttia (eli tiettyyn puun solmuun) puu voidaan tietysti myös käydä läpi samassa järjestyksessä kuin tapahtumaohjatussa käsittelyssä sopii erityisesti editoreille ja selaimille Käsittely: esimerkki <TABLE> <TBODY> <TR> <TD>Shady Grove</TD> <TD>Aeolian</TD> </TR> <TR> <TD>Over the River, Charlie</TD> <TD>Dorian</TD> </TR> </TBODY> </TABLE>
Esimerkki: tapahtumaohjattu käsittely Tapahtumat: Esimerkki: puukäsittely startdocument start element table start element tbody start element tr start element td characters: Shady Grove end element td start element td characters: Aeolian... Käsittelytapojen vertailu tapahtumaohjattu käsittely tehokas, vie vähemmän muistia kaikki muunnokset eivät mahdollisia mutta joskus myös tapahtumaohjattu prosessori voi rakentaa dokumentista muistiin puun puukäsittely antaa enemmän mahdollisuuksia käsittelyyn tehottomampi, vie enemmän muistia Standardikäsittelyliittymät ohjelmakirjastot tarjoavat liittymän (API), jonka kautta sovellus voi käsitellä XML dokumenttia SAX Simple API for XML tapahtumaohjattu käsittely DOM Document Object Model puukäsittely dom puu SAX Simple API for XML SAX versio 2.0 Toukokuu 2000 SAX2 http://www.saxproject.org/ API (application programmer s interface) de facto standard paljon toteutuksia esim. Apachen Xerces SAX eri kielillä (Java, C++, Perl) DOM Document Object Model Core Level 3 (syyskuu 2001),... http://www.w3.org/dom/ API (application programmer s interface) XML ja HTML puukäsittely erilaisia standardilaajennuksia toteutuksia esim. Apachen Xerces DOM Muut muunnostyökalut myös muut työkalut (liittymät) mahdollisia tekstinkäsittelytyökalut (unix, jne.) skriptit myös osien järjestyksen vaihtaminen, lajittelu, uuden sisällön automaattinen generointi XSLT XML Stylesheet Language Transformation White space välilyönnit rivinvaihdot carriage return line feed sarkainmerkit Tyhjät välit Kuuluuko dokumenttiin vai onko luettavuuden takia lisätty? Moniselitteinen miten pitäisi prosessoida?
Rivinvaihdon normalisointi Rivinvaihdon merkitsemiseen voidaan käyttää LF merkkiä (line feed, esim. Unix) CR merkkiä (carriage return, esim. Macintosh) molempia (esim. Windows) XML käyttää LF merkkejä kaikki CR merkit muutetaan LF merkeiksi yhdistelmästä CR+LF tulee myös LF peräkkäiset samanlaiset rivinvaihtomerkit käsitellään erikseen Tyhjät välit merkkauksessa Tyhjä väli = yksi välilyönti <country president = "Tarja Halonen" capital = "Helsinki" population = "5.2"> on sama kuin <country president = "Tarja Halonen" capital = "Helsinki" population = "5.2" > Tyhjät välit elementin sisällössä Jos on DTD validoiva jäsennin tietää jos elementti koostuu vain muista elementeistä (eikä datasta) jäsentimen on kerrottava sovellukselle mahdollisesta tyhjästä välistä, joka esiintyy elementin sisällössä sovelluksen voi ottaa välit huomioon tai jättää ne huomioimatta kuitenkaan ei ole selvä miten pitäisi tehdä jos sisältö koostuu sekä elementeistä että datasta <para> A paragraph with<emph> space </emph>. </para> Tyhjät välit elementin sisällössä Jos ei ole DTD XML prosessori ei voi tietää koostuuko elementin sisältö pelkästään elementeistä vai myöskin datasta siten <?xml... standalone="no"> voidaan myös tulkita siten että jäsennin luultavasti käsittelee tyhjät välit väärin Attribuutti: xml:space xml:space = "preserve" tyhjät välit merkitseviä xml:space = "collapse" tyhjät välit eivät ole merkitseviä tyhjän välin merkit tiivistyvät yhteen merkkiin jopa DTD:ssä <!ELEMENT preform (#PCDATA)> <!ATTLIST preform xml:space #FIXED "preserve"> Suositus (Bradley) standardi ei huomioi paljoakaan tyhjiä välejä käytännön ratkaisu: käytetään tyhjiä välejä niin kuin SGML:ssä ja HTML:ssä oletetaan, että lohkoelementti = teksti, joka on erotettu muusta tekstistä tyhjällä rivillä in line elementti = "tekstin sisällä", ei erotettu muusta tekstistä Suositus: sovelluksen pitäisi tunnistaa kaikki lohko ja in line elementit poistaa lohkojen ympärillä olevat tyhjät välit poistaa rivit jotka eivät sisällä mitään muuta kuin kommentteja tai esittelyjä poistaa tyhjät välit lohkojen alusta ja lopusta muuttaa lohkoelementeissä olevat rivinvaihdot välilyönneiksi tiivistää useammat peräkkäiset välilyönnit yhdeksi välilyönniksi Nimiavaruudet standardi: Namespaces in XML voidaan rakentaa dokumentteja, jotka koostuvat eri DTD:eiden osista yhdistelmädokumentit esim. HTML taulukot: helppo tapa esittää taulukkoa (ulkoasuun perustuen) joskus olisi toivottavaa että voisimme liittää mukaan HTML taulukon XML dokumenttiin ongelma: nimien yhteentörmäykset
Nimiavaruus DTD omistaa nimiavaruuden, jossa kaikki elementtinimet ovat uniikkeja kaikki tietyn elementin attribuuttinimet ovat uniikkeja siten kaikki viittaukset elementtiin ja tietyssä elementissä olevaan atribuuttiin ovat yksiselitteisiä dokumentti voi sisältää tietoa, joka on esitelty useammassa nimiavaruudessa Nimiavaruuden tunnistaminen Useimmat standardit löytyvät nykyään verkosta esim. http://www.w3.org/tr/rec html40 Nimiavaruus standardi käyttää URL osoitteita yksiselitteisinä tunnuksina Nimiavaruutta käyttävällä sovelluksella ei kuitenkaan tarvitse olla yhteys internetiin, URL on (vain) hyödyllinen uniikki merkkijono Merkitään prefix:name URL on kuitenkin usein liian pitkä... Nimiavaruuden käyttäminen Nimiavaruuden käyttäminen, jatk. Nimiavaruus esitellään xmlns attribuutissa Lisäksi annetaan nimiavaruudelle sopiva lyhenne <X:html xmlns:x=" http://www.w3.org/tr/rec html40"> tai <xsl:stylesheet xmlns:xsl=" http://www.w3.org/1999/xsl/transform " version="1.0"> Huom: syntaksi: xmlns:<prefix>="<url>" <Q:book xmlns:q="file:/dtds/book.dtd" xmlns:x="http://www.w3.org/tr/rec html40"> <Q:para>A normal paragraph</q:para> <X:p>A HTML paragraph</x:p> </Q:book> Oletusnimiavaruus esitellään nimiavaruus ilman prefix osaa: <book xmlns="..."> <para>a normal paragraph</para> </book> oletusnimiavaruus voidaan muuttaa missä tahansa elementissä myös jonkun nimiavaruuden attribuutteja voidaan käyttää toisen nimiavaruuden elementeissä DTD:t ja nimiavaruudet Jotta dokumentin voisi validoida täytyy DTD:hen lisätä kaikki etuliitteet <!ELEMENT book (para X:p)*> Jäsentimet eivät osaa yhdistää useampia DTD:eitä (vielä)! Merkistöt ASCII (Amercian Standard Code for Information Interchange) "tekstitiedosto", 127 merkkiä laajennus: é, é Extended ASCII 255 merkkiä, eri laajennuksia ISO8859 255 merkkiä ISO8859/1: ASCII + meille tavallisimmat Unicode Merkistöt 65536 mahdollista merkkiä http://www.unicode.org/charts/ ISO/IEC 10646 UCS 2 (=ISO 8859/1), UCS 4 BMP UTF, UTF 8, UTF 16 XML prosessoreiden täytyy hyväksyä UTF 8 ja UTF 16
XML esittely <?xml encoding="iso 8859 1"> Jokaisessa ulkoisessa entiteetissä pitää olla tällainen esittely jos merkistö eroaa dokumenttientiteetin merkistöstä