XML česky: průvodce a nástroje

Značky, které dávají datům řád.

XML je značkovací jazyk pro strukturovaná data — čitelný pro člověka, spolehlivě zpracovatelný strojem už přes čtvrt století. Tenhle průvodce XML česky vysvětluje syntaxi, pravidla i nástroje, se kterými se v praxi potkáš.

Autor: Aktualizováno

Před <recept><nazev>Palačinky</nazev><ingredience jednotka="ks">2</ingredience><ingredience jednotka="ml">250</ingredience></recept>
Po<recept>  <nazev>Palačinky</nazev>  <ingredience jednotka="ks">2</ingredience>  <ingredience jednotka="ml">250</ingredience></recept>

XML ve zkratce

XML (Extensible Markup Language) je obecný značkovací jazyk, který W3C standardizoval v roce 1998 jako zjednodušenou variantu staršího SGML. Na rozdíl od HTML nemá pevně dané značky — vymýšlíš si je sám, podle toho, jaká data zrovna popisuješ.

Dokument je strom vnořených elementů. Každý element může nést atributy, textový obsah nebo další elementy uvnitř sebe. Tahle jednoduchá stavba stojí za tím, proč XML za pětadvacet let nezestárlo — parser pro něj najdeš v každém jazyce a chybu v něm odhalí i člověk bez jediného nástroje.

Celá kapitola: historie XML, rozdíl oproti HTML a formáty postavené na XML →

Anatomie XML dokumentu

Než začneš XML psát, stačí znát pár stavebních bloků. Ukázka níže je fiktivní záznam z e-shopu — každý řádek předvádí jinou část syntaxe.

<?xml version="1.0" encoding="UTF-8"?>
<!-- Konfigurace obchodu -->
<obchod verze="2.1">
  <polozka id="A100" skladem="true">
    <nazev>Mechanická klávesnice</nazev>
    <cena mena="CZK">2490</cena>
  </polozka>
  <![CDATA[ <poznamka>Toto se nebude parsovat jako značka</poznamka> ]]>
</obchod>
XML deklarace
Uvádí verzi XML a kódování znaků. V XML 1.0 je nepovinná, ale pokud ji píšeš, musí stát úplně na začátku souboru, před ní nesmí být ani mezera. Spolu s komentáři a případným <!DOCTYPE> před kořenovým elementem tvoří tzv. prolog.
Komentář
Text mezi <!-- a -->. Není součástí dat dokumentu: parser ho aplikaci předat může (DOM, XPath comment()), ale nemusí. Uvnitř nesmí být dvě pomlčky za sebou.
Kořenový element
Jediný element, který obaluje celý zbytek dokumentu — v ukázce <obchod>.
Atribut
Pár klíč a hodnota zapsaný přímo v otevírací značce, třeba verze="2.1".
Vnořený element
Element uvnitř jiného elementu — dokument je strom, ne plochý seznam.
Textový obsah
Čitelný text mezi otevírací a uzavírací značkou, třeba název položky.
CDATA sekce
Blok, jehož obsah se nikdy neparsuje jako značky — hodí se pro text nebo kód se znaky < a &.

Z čeho se XML dokument skládá: všechny stavební prvky →

Jmenné prostory (namespaces)

Jakmile začneš kombinovat XML z různých zdrojů — třeba vlastní dokument, do kterého vložíš kus SVG grafiky — narazíš na kolizi: oba slovníky mohou mít element se stejným jménem, ale jiným významem. Jmenný prostor tenhle konflikt rozliší přiřazením prefixu ke jménu značky.

<?xml version="1.0"?>
<recept xmlns="http://example.cz/recept" xmlns:svg="http://www.w3.org/2000/svg">
  <nazev>Palačinky</nazev>
  <svg:svg width="100" height="100">
    <svg:circle cx="50" cy="50" r="40" />
  </svg:svg>
</recept>

Atribut xmlns deklaruje výchozí jmenný prostor pro celý strom pod sebou; xmlns:svg zavádí prefix, který pak značky jednoznačně přiřadí ke svému slovníku. URI v hodnotě se nikam nenačítá — slouží jen jako jedinečný identifikátor, ne jako odkaz na soubor.

Jmenné prostory podrobně: výchozí prostor, atributy a časté chyby →

Pravidla dobře formovaného XML

Porušení kteréhokoli z těchto pravidel je podle specifikace fatální chyba: parser ji musí nahlásit a dokument nesmí zpracovat jako platná data. Jak se to projeví, záleží na programu. Knihovna vyhodí výjimku, prohlížeč místo dokumentu ukáže chybovou hlášku.

  • Dokument má právě jeden kořenový element, který obaluje všechno ostatní.
  • Každá otevírací značka <tag> má odpovídající uzavírací </tag>, nebo je zapsaná jako samo-uzavírací <tag />.
  • Značky se nesmí křížit — vnořené elementy se uzavírají v opačném pořadí, v jakém se otevřely.
  • Hodnoty atributů jsou vždy v uvozovkách, třeba id="42".
  • XML rozlišuje velká a malá písmena: <Polozka> a <polozka> jsou dva různé elementy.
  • Znaky < a & se v textovém obsahu zapisují jako entity (&lt;, &amp;), nebo se schovají do CDATA sekce.

Splnit tahle pravidla znamená, že dokument je dobře formovaný (well-formed). To ale neříká nic o tom, jestli obsahuje správné elementy ve správném pořadí — to popisuje schéma (XSD, DTD nebo RELAX NG), proti kterému lze dokument navíc validovat. Dokument, který odpovídá své DTD, je podle specifikace XML validní; shodě s XSD nebo RELAX NG se říká validita vůči schématu. Jestli tvůj dokument pravidla splňuje, ověříš v XML validátoru.

Jak funguje parser a co znamenají jeho chybové hlášky →

Kódování a entity

Kódování souboru uvádí XML deklarace <?xml version="1.0" encoding="UTF-8"?>. Bez deklarace a bez BOM musí být dokument v UTF-8, proto ji řada moderních dokumentů vynechává. Soubor v UTF-16 musí začínat značkou BOM. Jiné kódování, třeba windows-1250, musí deklarace uvést, jinak parser skončí chybou nebo přečte diakritiku špatně.

Povinně se escapují jen dva znaky: < a &. XML zná celkem pět předdefinovaných entit, zbylé tři potřebuješ jen v určitých situacích:

EntitaZnakKdy je povinná
&lt;<vždy, v textu i v hodnotě atributu
&amp;&vždy, v textu i v hodnotě atributu
&gt;>jen v posloupnosti ]]> v textu, jinak nepovinná
&quot;"jen uvnitř hodnoty atributu ohraničené uvozovkami "…"
&apos;'jen uvnitř hodnoty atributu ohraničené apostrofy '…'

Kódování, BOM a číselné entity podrobně →

Zpracování: DOM, nebo SAX?

Jakmile chceš XML zpracovat programově, vybíráš mezi dvěma přístupy. DOM načte celý dokument do stromu v paměti, se kterým pak můžeš libovolně pracovat. SAX a další streamovací parsery čtou dokument postupně a v paměti drží jen aktuální uzel — hodí se pro soubory v řádu gigabajtů.

Srovnání DOM a SAX a jak z textu vznikne strom →

XML v JavaScriptu: DOMParser, XPath a XMLSerializer →

XML v PHP: SimpleXML, DOMDocument a XMLReader →

XML v C#: XDocument, XmlReader a XPath →

XML v Pythonu: ElementTree, lxml a iterparse →

Bezpečnost: útok XXE a jak ho v parseru vypnout →

XPath a XSLT

XPath je dotazovací jazyk, kterým v XML dokumentu adresuješ konkrétní uzly — podobně jako CSS selektor v HTML, jen výrazově bohatší. Výraz níže by v ukázce z anatomie dokumentu výše našel cenu položky s id A100:

/obchod/polozka[@id="A100"]/cena

XSLT (Extensible Stylesheet Language Transformations) staví na XPath a umí celý dokument přepsat do jiné podoby — třeba XML převést na HTML stránku nebo na jiný XML slovník. Sám je to XML dokument plný šablon, které se aplikují na uzly nalezené přes XPath.

Výrazy i šablony si můžeš vyzkoušet v záložkách XPath a XSLT XML nástroje.

XPath podrobně: osy, predikáty a funkce s příklady →

XSLT podrobně: šablony a převod XML na HTML →

Tahák XML a JSON: osy a funkce XPath, entity, XSD typy a JSONPath na jedné stránce →

Kde se s XML setkáš

I když se dnes o nová API obvykle píše v JSON, XML zůstává páteří spousty formátů a systémů, které používáš denně:

XML, nebo JSON?

Otázka, kterou si položí skoro každý, kdo navrhuje formát pro výměnu dat. Odpověď záleží na tom, co dokument popisuje.

VlastnostXMLJSON
Datový modelstrom elementů s atributy a textemobjekty, pole a hodnoty
Datové typyvše je text; typy dodá až schémařetězec, číslo, true/false, null
Atributyanone, jen vlastnosti objektu
Smíšený obsah (text + značky)ano, přirozenějen obtížnými konvencemi
Komentářeanone; povolují je až nestandardní dialekty JSONC a JSON5
SchémaDTD, XSD, RELAX NG, SchematronJSON Schema

Pro dokumenty se smíšeným obsahem je XML pořád lepší volba. Pro strojová API bez potřeby komentářů a atributů dnes obvykle vyhrává JSON.

XML vs JSON: podrobné srovnání a úskalí převodu →

Vyzkoušej si to

Vlož vlastní XML do validátoru a formátovače, nebo si projdi seznam dalších nástrojů pro každodenní vývojářskou práci.