XML

**XML** (*Extensible Markup Language*) on merkintäkielien standardi, joka määrittää tietojen merkintämuodon loogisella rakenteella. XML-kieliä käytetään sekä formaattina tiedonvälitykseen järjestelmien välillä että tiedostomuotona dokumenttien tallentamiseen. XML-kieli on rakenteellinen kuvauskieli, joka auttaa jäsentämään laajoja tietomassoja selkeämmin. XML:n kehittäjä on World Wide Web Consortium.

XML on tekstimuotoinen SGML-kielen yksinkertaistettu osajoukko, joka muistuttaa WWW:ssä käytettyä HTML-kieltä. XHTML on HTML-kielen versio, joka on siivottu puhtaaksi XML-kieleksi.

## XML-dokumentin ulkoasu
### Merkistö
XML-dokumentti on tekstiä, jossa lailliset merkistöt ovat Unicode ja ISO/IEC 10646.
Standardi vaatii XML-jäsentimiä tukemaan Unicoden UTF-8- ja UTF-16-merkistökoodauksia. Jäsennin saattaa tukea muitakin koodauksia, esimerkiksi ISO 8859-1:aa.

### Prologi

XML-dokumentti voi alkaa *prologilla*, joka sisältää XML-version, sekä mahdollisesti dokumentin koodauksen ja tiedon voidaanko mahdollisesti jäljempänä viitattu DTD jättää lukematta. Prologia ei saa dokumentissa edeltää yhtään merkkiä muuta sisältöä.

```xml
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
```


### DOCTYPE

DOCTYPE-määrityksellä dokumentille voidaan määrittää DTD (Document Type Definition), esimerkkinä XHTML-dokumentin DOCTYPE-määrittely:


```xml
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
```


### Elementit ja attribuutit

XML-dokumentin data koostuu sen sisältämästä tekstistä sekä merkinnöistä, joita ovat sisällölle rakenteen ja merkityksen antavat *elementit* ja elementtejä tarkentavat *attribuutit*. Elementtejä voi olla rajattomasti sisäkkäin tai peräkkäin, mutta ylimmällä tasolla kaikkien elementtien tulee olla yhden *juurielementin* lapsia. Elementti kuvataan alku- ja loppumerkinnöillä eli tägeillä:

```xml
<elementti attribuutti="arvo">
...
</elementti>
```


*Tyhjä elementti*, voidaan merkitä joko alku- ja loppumerkinnällä, joiden välissä ei ole sisältöä tai lyhennetyllä merkintätavalla:

```xml
<elementti attribuutti="arvo"/>
```


Isot ja pienet kirjaimet katsotaan elementtien nimissä eri merkeiksi. Esimerkiksi `<Esimerkki>` ja `</Esimerkki>` muodostavat oikein muotoillun parin, kun taas `<'''E'''simerkki>` ja `</esimerkki>` eivät näin tee.

Attribuutit ovat avain–arvo-pareja, joten tietyn niminen attribuutti voi esiintyä samassa alkutägissä vain yhden kerran eikä niiden järjestyksellä ole merkitystä.

### Nimiavaruusmäärittelyt

Elementtien aloitusmerkinnät voivat sisältää attribuuttien tapaan myös *[[nimiavaruus]]määrittelyjä*. Niillä voidaan erottaa muuten saman nimiset elementit (tai attribuutit) eri nimiavaruuksiin, jolloin eri XML-dokumentteja yhdisteltäessä vältytään tahattomilta nimien yhteentörmäyksiltä. Nimiavaruusmäärittely voi luoda joko oletusnimiavaruuden tai nimiavaruusetuliitteen. Yksikäsitteisyyden varmistamiseksi nimiavaruuden arvo on muodoltaan URI. Esimerkki SVG-dokumentista, jossa määritellään SVG:n oletusnimiavaruus ja etuliitteen avulla käytettävä XLink-nimiavaruus:

```xml
<svg xmlns="http://www.w3.org/2000/svg"
     xmlns:xlink="http://www.w3.org/1999/xlink">
    <a xlink:href="/svg/index.html">
        ...
    </a>
</svg>
```


Esimerkissä elementit `&lt;svg&gt;` ja `&lt;a&gt;` kuuluvat SVG-nimiavaruuteen, kun taas attribuutti `href` kuuluu XLink-nimiavaruuteen, sillä nimen edessä on nimiavaruutta vastaava etuliite kaksoispisteellä `:` erotettuna.

### Kommentit

XML-dokumentti voi elementtimerkintöjen ulkopuolella sisältää *kommentteja*. Kukin kommentti erotetaan muusta tekstistä `&lt;!--` ja `--&gt;` merkintöjen väliin:

```xml
<elementti>

...
</elementti>
```


Kommentti ei SGML-yhteensopivuuden vuoksi saa sisältää `--` merkkijonoa ja se päättyy ensimmäiseen `-->` merkintään. Tästä syystä kommentit eivät voi olla sisäkkäin. Kommenttia ei voi asettaa alku- tai lopputägin sisään vaan se pitää olla tägien välissä tai niiden ulkopuolella.

### Käsittelyohjeet

*Käsittelyohjeet* ovat pyyntöjä XML-käsittelijälle ohjata suoritus toiselle ohjelmalle, yleisenä esimerkkinä on tiedostoon liitetyn XSLT-dokumenttiin viittaaminen:

```xml
<elementti>
<?xml-stylesheet type="text/xsl" href="style.xsl"?>
...
</elementti>
```


XML-prologi ei samannäköisestä ulkoasustaan huolimatta ole käsittelyohje.

## XML-dokumentin oikeellisuus

XML:n oikeellisuudelle on kaksi määritelmää
# *hyvin muodostettu* (Well-formed) dokumentti täyttää kaikki syntaksisäännöt
# *kelvollinen* eli *validi* (Valid), jolloin XML-dokumentin rakenne ja sisältö on jonkin dokumenttityypin määritysten mukainen.

Jotta dokumenttia voidaan pitää *hyvin muodostettuna*, sen täytyy täyttää vähintään seuraavat vaatimukset:
* Dokumentti sisältää vain sallittuja ja oikein koodattuja Unicode-merkkejä
* Merkkejä `&lt;` ja `&amp;` käytetään vain niiden ollessa osana merkintäkoodia.
* Dokumentissa on tasan yksi juurielementti.
* Ei-tyhjillä elementeillä on aina sekä alku- että loppumerkki, joiden nimi vastaa toistaan täsmälleen. Tyhjille elementeille voidaan käyttää lyhennettyä merkintätapaa.
* Elementit voivat olla sisäkkäisiä, mutta ne eivät mene ristiin toisten elementtien kanssa.
* Kaikki nimet sisältävät vain nimissä sallittuja merkkejä. Tämä koskee elementtien, attribuuttien, nimiavaruusetuliitteiden, käsittelyohjeiden kohteiden ja entiteettien nimiä.
* Jokaisen attribuutin arvo on erotettu lainausmerkkien `"` tai heittomerkkien `'` sisään.
* Dokumentissa käytettyjen entiteettien pitää olla kelvollisesti määriteltyjä.

Näiden vaatimusten täyttäminen on ratkaisevan tärkeää, sillä mikäli dokumentti ei ole *hyvin-muodostettu*, ei sitä voida käsitellä XML:nä ja jäsentimen on määritysten mukaan pakko keskeyttää prosessointi ja hylätä koko tiedosto. Tätä menettelytapaa nimitetään myös drakoniseksi virheenkäsittelyksi.

## Määritellyn kielen kielioppisäännöt

XML määrittelee usein johonkin sovellukseen käytetyn tiedon rakenteen. Tätä rakennetta usein sanotaan kieleksi. Jos kieli on määritelty jollakin XML-kuvauskielellä, XML-dokumentin kielen mukaisuus voidaan tarkastaa automaattisella työkalulla eli validaattorilla.

XML-kuvauskieli määrittelee esimerkiksi elementit, niiden väliset suhteet ja arvojen arvoalueet.

Yksinkertaisin kuvauskieli on DTD *(Document Type Definition)*. Esimerkkinä DTD-määrittelystä voimme määritellä luettelon henkilöistä:


```xml
<!ELEMENT luettelohenkiloista (henkilo*)>
 <!ELEMENT henkilo (nimi, syntymaaika?, sukupuoli?, sosiaaliturvatunnus?)>
 <!ELEMENT nimi (#PCDATA)>
 <!ELEMENT syntymaaika (#PCDATA)>
 <!ELEMENT sukupuoli (#PCDATA)>
 <!ELEMENT sosiaaliturvatunnus (#PCDATA)>
```


Monimutkaisempia ja uudempia määrittelykieliä ovat XML Schema ja RELAX NG. Ne ovat itsessään XML-dokumentteja. Näiden avulla voidaan esimerkiksi asettaa rajoituksia numeroiden arvoalueille.

## Yleisiä XML-työkaluja

XML-kielet kuvaavat dokumentin loogista rakennetta, eivät niiden esittämistä. Niinpä samasta XML-dokumentista voidaankin luoda useita erilaisia esityksiä. Samasta varastotilanteen kuvaavasta XML-tiedosta voidaan tuottaa esimerkiksi sekä varastotilanteen kuvaavat WWW-sivut että tulostettavat rahtikirjat.

Yksi ratkaisu XML-sivujen muuntamiseen erilaisiin tulostusformaatteihin on HTML:n kanssa usein käytetty CSS. CSS ei kuitenkaan itse ole XML:n mukainen kieli. Mikäli XML-dokumentin pohjalta halutaan muodostaa uusi XML-tiedosto eri rakenteella, voidaan tarkoitukseen käyttää XML:n mukaista XSLT-muunnoskieltä.

XSLT-kielen kanssa määritellään XPath-osoitinkieli, jolla voidaan määritellä helposti osajoukkoja XML-dokumentista.

FO-sivunkuvauskieli on yleinen XML-formaatti, johon dokumentteja voidaan muuntaa helpompaa tulostamista varten. Se siis vastaa jossain määrin HTML-dokumentin ulkoasuominaisuuksia.

## XML:n käytön tuomia etuja

XML-dokumenttien käytöllä tavoitellaan muun muassa
* sisältöjen yhdenmukaisempaa tallennusmuotoa
* sisältövirheiden välttämistä
* tiedon hakemisen helpottamista
* sisällön monikäyttöisyyden ja monikanavajulkaisemisen parantamista
* käsittelyvaiheiden automatisointia
* riippumattomuutta tietystä ohjelmistotoimittajasta
* tiedon pitkäaikaissäilyvyyden parantamista
* integraatioiden helpottamista
* SEPA ja XML sanomat yleensä yritysten välisessä tiedonsiirrossa

## XML-pohjaisia standardeja ja määrityksiä
### Tietämyksen esittäminen
* RDF
* XLink
* Web Ontology Language
* XForms

### Asiakirjojen esittäminen
* OpenDocument (ODF)
* OXML
* DocBook XML

### Asiakirjojen yms. erikoisosat
* MathML – Matemaattiset merkinnät
* SVG – Kuvat
* HCard – Yhteystiedot
* VoiceXML – Äänet
* SMIL – sisällöt, joissa esimerkiksi video ja ääni synkronoidaan
* Dublin Core – Metadata

### Tiedonsiirto
* XML-RPC – toiminnon suorittaminen verkon yli
* SOAP – toiminnon suorittaminen verkon yli
* AJAX – toiminnon suorittaminen verkon yli
* WSDL – verkkoon tarjottujen palvelujen kuvaus
* WML – WAP-sivut
* XSQL – XML:n ja SQL:n yhdistelmä tiedonhakuun

### Sovellusalueittain
* FIXML
* ebXML-määritysperhe
* Geography Markup Language (GML) – paikkatietojen kuvauskieli
* JDF – graafisen teollisuuden työmäärykset
* TM-XML – tavaramerkkitieto

## Katso myös
*DITA
*EDI
*ISO 20022
* Luettelo XML-kielistä

## Lähteet

## Aiheesta muualla

* World Wide Web Consortiumin XML-pääsivu
* XML-spesifikaatio