Základním principem za XML je snaha doplnit „obyčejný“ text o další (s ním svázané) významy, nebo jinak řečeno doplnit text o sémantiku.
Texty vybavené sémantikou jsou samozřejmě mnohem starší, než XML – vezměme si za příklad konfigurační soubory ini nebo config nebo průmyslový standard SGML. Ve všech těchto textových souborech je nějakým způsobem přidán jednotlivým částem textu dodatečný význam (pozicí a závorkováním u konfiguračních souborů, sadou velmi mocných a zároveň i volných pravidel u SGML).
Význam XML tkví v tom, že byla vybrána jedna dostatečně obecná a přitom velmi jednoduchá metoda (v podstatě velmi specifická a velmi „ořezaná“ podmnožina standardu SGML), jak textu tento dodatečný význam přidávat. Hlavní přínos XML pak tkví asi v následujícím:
Strukturu XML-souboru, kerý je jinak v podstatě zakořeněným stromem elementů, asi nejlépe vystihuje následující přirovnání Míly Niče:
„XML-soubor je tvořen různě oštítkovanými (atributy) krabicemi (elementy) zanořenými navzájem do sebe bez proboření stěn (well-formed), přičemž vnější krabice je právě jedna (kořenový element).”
Pokud navíc tyto „krabice“ odpovídají nějaké předem nadefinované struktuře, říkáme navíc, že uvedené XML je validní (valid).
Pro následující ukázkový XML-soubor..
..tak máme:
<kořen>
<hlavička>
, <para>
, <obrázek>
, <zvýraznění>
<hlavička>
s atributem @jazyk
a element <obrázek>
s atributy @zdroj
a @název
@
.
Požadavek „neprobořených stěn krabic“ – tedy nepřekřížených elementů – ústící v tzv. dobře naformátovaný XML-dokument (well-formed document) je vlastně základem pro to, aby struktura XML-souboru byla vůbec rozumně reprezentovatelná jako strom. Pro příklad z předchozího slajdu:
Funkcí elementu je pomocí svého počátečního (<název-elementu>
) a koncového (</název-elementu>
) prvku označit v něm zanořenou podčást stromu XML-dokumentu.
Přitom platí:
Uvnitř elementu se mohou nacházet další elementy (správně zanořené) nebo textové řetězce (byť to s sebou přináší nečekané komplikace, jak uvidíme na dalším slajdu).
Stejně tak dobře ale může element nést význam sám o sobě, bez jakéhokoliv dalšího zanořeného obsahu. Principielně je možné prázdné elementy zapsat dvěma různými způsoby, které však nejsou vždy zcela vzájemně zaměnitelné:
<element />
– skutečně prázdný, nepárový element (před ukončovacím lomítkem nemusí být mezera, ale pro přehlednost se tam často dělá)
<element></element>
– párový element, zrovna prázdný
Rozdíl mezi oběma zápisy se může fakticky projevit pouze v tom případě, že používané XML má k dispozici popis své povolené struktury – první varianta je pak skutečně prázdný nepárový element, který nemůže mít žádný obsah, zatímco druhá varianta je párový element, který jen prostě zrovna v danou chvíli žádný obsah nemá.
<script>
, který je nadefinován jako párový, ale dlouhá léta u spousty prohlížečů v případě prázdného obsahu procházelo jeho zapsání jako nepárového.
Ač to na první pohled může být překvapivé, následující dvě ukázky XML-souboru nejsou stejné:
Ve druhé z nich je totiž navíc kolem elementů <jméno>
a <příjmení>
ještě několik odřádkování a mezer (případně též tabulátorů). Těmto znakům se souhrnně říká bílé znaky (white spaces) a chování XML-parserů vůči nim je jednou z nejsložitějších částí zpracování XML-dokumentů.
Člověku je na první pohled jasné, že v našem ukázkovém příkladu jsou všechny přebytečné mezery a nové řádky jen pro usnadnění čtení (člověku). Ale z následujícího fragmentu HTML, který obsahuje tzv. smíšený obsah (mixed content; elementy a textové listy na stejné úrovni zanoření v rámci stromu a hned vedle sebe)..
..je vidět, že někdy (a poměrně často :-) jsou bílé znaky důležité.
Zpracování smíšeného obsahu a bílých znaků je obecně velmi složité a problematické, ale z praktického hlediska pro běžné použití se dá shrnout do celkem jednoduché zásady:
Není-li někde (ve schématu pro daný XML-dokument, v přepínači DOM-stroje zpracovávajícího daný XML-dokument…) řečeno jinak, všechny bílé znaky ve zdrojovém XML-dokumentu jsou významné.
Uvozovací elementy párových nebo elementy nepárové mohou být doplněny o tzv. atributy:
Pro jejich použití platí následující pravidla:
=
(rovnítko).
'
) nebo dvojtých ("
) uvozovkách. (Obsahuje-li sama uvozovky, musí pro uzavření hodnoty atributu býti použity ty druhé.)
Co se bílých znaků v hodnotách atributů týká, není situace o moc jednodušší než u elementů. Stručně se dá říci, že čím jednodušší hodnoty atributů budete mít (pokud atributy vůbec použijete), tím lépe pro vás.
Co se atributů týká, tak nejvyhraněnější názor na ně má skupina, která tvrdí, že by vůbec neměly existovat a veškerou jejich práci by na sebe měly kompletně převzít elementy. To jest asi něco takovéhoto (či podobného):
Jelikož zakázání atributů vede ke značnému zjednodušení procesování XMLčka, můžeme se s tímto poměrně extrémním přístupem setkat v praxi až překvapivě často. Ale už na druhý pohled je vidět, že atributy mají své místo – především pro jednodušší, upřesňující prvky a také pro čitelnost.
V případě potřeby je možno do XML doplnit komentář pomocí sekvence znaků <!--
pro začátek a -->
pro konec:
--
(asi trošku překvapivě tedy nikoli sekvence -->
), tato se tudíž nesmí vyskytovat nikde uvnitř zakomentované části dokumentu.
Prakticky takto můžete velkou část dokumentu „schovat“ před zpracováním, byť XML-parser se může rozhodnout poskytnout přístup i k obsahu komentářů.
Podle první verze standardu nemusí mít XML-dokument žádnou hlavičku, stačí tedy pouze kořenový element (a to klidně i nepárový a tudíž bez obsahu). Automaticky to však znamená, že dokument musí být v kódování UTF-8 (viz též zde).
Chcete-li použít kódování jiné nebo jinou verzi standardu, musíte už hlavičku uvést:
PS: Konstrukce typu <?název … _>
jsou tzv. procesní instrukce.
Zatím jsme v ukázkách viděli jakási nepravděpodobná uskupení elementů (a atributů), která se však řídila jistými pravidly zápisu. A o tom XML právě je:
XML není přímo jeden konkrétní jazyk – je to tak zvaný metajazyk, tedy jazyk sloužící k navrhování jiných jazyků (které pak už jsou přímo těmi XML-jazyky).
Příkladem konkrétních jazyků postavených na základech XML budiž třeba:
XML jako metajazyk tedy popisuje, jak vytvářet nové XML-jazyky. Výhodou je, že tyto různé dialekty („různobarevné krabice”) můžeme navzájem pomocí tzv. jmenných prostorů míchat – elementy/atributy z jiného XML-dialektu jsou prostě označeny identifikátorem tohoto dialektu (tj. jmenným prostorem, „barvou”):
Je třeba poznamenat, že na označení jmenného prostoru existuje poměrně restriktivní omezení (ze standardu Namespaces in XML 1.0 (Third Edition)), na které ale v praxi málokdo hleděl, díky kterému je příklad z předchozího slajdu špatně ^_^
Správně by totiž označení jmenného prostoru mělo vyhovovat standardu pro zadávání tzv. URI (= Uniform Resource Identifier), což především znamená, že musí obsahovat označení schematu následované dvojtečkou a teprve po ní vlastní bližší označení jmenného prostoru. Navíc se to celé dá zapsat v podstatě pouze pomocí ASCII a označení schematu by mělo spadat do schválených podle IANA (což se v praxi ignoruje ještě víc).
Správněji by tudíž kořenový element z příkladu vypadal spíše kupříkladu takto:
urn
jako jedno ze schválených schemat označuje Uniform Resource Names. (Klidně si tam místo něj dejte třeba hafhaf, taky to bude správně :-)
Už jsme viděli, jak se do XML přidávají komentáře a hlavička. Oba jsou to konkrétní příklady obecných „řídicích“ sekvencí:
Řídicí sekvence typu <!…>
slouží například pro:
<!--…-->
<!DOCTYPE …>
<![CDATA[…]]>
Řídicí sekvence typu <?…?>
jsou tak zvané procesní instrukce. Slouží k předávání doplňujících informací zpracovávající aplikaci a existuje jich několik standardních (jako je výše uvedená hlavička nebo připojení stylopisu) a neurékom proprietárních podle použitých nástrojů.
Je zjevné, že abychom mohli XML-jazyky více využívat (a třeba je vyměňovat mezi aplikacemi), tak musíme vědět, jakou strukturu ten který jazyk má, tedy jaké elementy a atributy a s jakým obsahem jsou kde povolené. K tomu potřebujeme dvě věci:
Za prvé způsob, jak popsat strukturu dokumentu. Prakticky se to řeší několika dalšími standardními jazyky:
A za druhé pak nástroje, které jsou schopné zkontrolovat, zda se vytvořený XML-dokument drží struktury mu předepsané (takovýto dokument se pak nazývá validní):
Při zpracování XML-dokumentu, jeho případném zobrazování, ale též už při popisu jeho struktury, musíme být schopni pronášet (a nějak zapisovat) tvrzení o jeho různých částech. V závislosti na daném použití existuje mnoho způsobů, jak daný problém řešit:
XML-dokumenty v prostředí webu nemají obecně předepsáno, jak by se měly zobrazit (pokud se samozřejmě nedíváte na konkrétní formát odpovídajícím programem, např. SVG-obrázek v prohlížeči). Záleží samozřejmě na cílovém použití daného dokumentu (často vůbec nemusí být určen k přímému „dívání“), ale v principu jsou k dispozici dvě metody:
PS: Obecný XML-dokument bez přiložené informace o zobrazení by se měl na webu zobrazit pouze v podobě textového obsahu svých elementů. V praxi však skoro všechny prohlížeče místo toho zobrazí pěkně přehledně naformátovanou stromovou strukturu. Důvod je asi ten, že pokud se člověk dívá na nějaké XML, tak chce skutečně spíše vidět jeho strukturu než jen texty bez sémantiky.