**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 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:

```
<!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ä:

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

```

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

```
<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 *nimiavaruusmää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:

```
<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 `<svg>` ja `<a>` 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ä `<!--` ja `-->` merkintöjen väliin:

```
<!--yksi kommentti-->
<elementti>
<!--toinen kommentti-->
...
</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:

```
<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ää

1. *hyvin muodostettu* (Well-formed) dokumentti täyttää kaikki syntaksisäännöt
2. *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ä `<` ja `&` 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ä:

```
 <!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
-------

1. 1 2  2.2 Characters *w3.org*. Viitattu 29.2.2020. (englanniksi)

Aiheesta muualla
----------------

CommonsCommons
Wikimedia Commonsissa on kuvia tai muita tiedostoja aiheesta **XML**.
* World Wide Web Consortiumin XML-pääsivu
* XML-spesifikaatio