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áš.
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, XPathcomment()), 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&.
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 (<,&), 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.
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:
| Entita | Znak | Kdy je povinná |
|---|---|---|
| < | < | vždy, v textu i v hodnotě atributu |
| & | & | vždy, v textu i v hodnotě atributu |
| > | > | jen v posloupnosti ]]> v textu, jinak nepovinná |
| " | " | jen uvnitř hodnoty atributu ohraničené uvozovkami "…" |
| ' | ' | jen uvnitř hodnoty atributu ohraničené apostrofy '…' |
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 →
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"]/cenaXSLT (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.
| Vlastnost | XML | JSON |
|---|---|---|
| Datový model | strom elementů s atributy a textem | objekty, pole a hodnoty |
| Datové typy | vše je text; typy dodá až schéma | řetězec, číslo, true/false, null |
| Atributy | ano | ne, jen vlastnosti objektu |
| Smíšený obsah (text + značky) | ano, přirozeně | jen obtížnými konvencemi |
| Komentáře | ano | ne; povolují je až nestandardní dialekty JSONC a JSON5 |
| Schéma | DTD, XSD, RELAX NG, Schematron | JSON 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.
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.
- Validátor a formátovač kontrola syntaxe s opravami, odsazení, minifikace
- XSD, DTD a RELAX NG validace proti vlastnímu schématu (záložka Schéma)
- Živý XPath tester shody se zvýrazní přímo ve zdrojovém XML
- XSLT transformace XML a šablona vedle sebe, výstup hned
- Převod XML ↔ JSON nastavitelné atributy, pole i smíšený obsah
- Strukturální porovnání bez ohledu na odsazení a pořadí atributů či prvků
- Generátor testovacích dat stovky fiktivních XML záznamů pro testy importů
- Generátor testovacích JSON dat stejné šablony s výstupem JSON nebo JSON Lines
- JSON nástroje JSONPath, JSON Schema, porovnání a převody