V přednášce základy XML jsme se dozvěděli prakticky všechno, co je potřeba k práci s XML. XML ale kromě toho obsahuje i další, podstatně exotičtější prvky (zakopli jsme kupříkladu o tzv. řídicí sekvence), se kterými se nemusíte potkat moc často, ale je třeba o nich vědět.
Na začátek zdánlivě jednoduché, ale často problémové pravidlo:
Pokud prvním elementem XML-dokumentu je XML-hlavička <?xml version="…" encoding="…"?>
, nesmí před ní být žádné tisknutelné znaky.
Po pravdě ve standardu je použito neměly by být, ale spousta nástrojů se na jiném začátku XML-dokumentu beznadějně zasekne, takže je bezpečnější se tohoto pravidla držet. Ostatně validační nástroje vás na to upozorní.
Na druhou stranu pokud má XML-dokument hlavičku <?xml …?>
, mezi ní a kořenovým elementem může být hromada dalších řídicích instrukcí typu <!…>
i <?…?>
, jak dokazuje například tento soubor ze zdrojových kódů prohlížeče Mozilla Firefox:
omni.ja/chrome/toolkit/content/global/selectDialog.xul
.
Jednodušší varianta:
Obsahem XML-dokumentu (a to i názvů elementů a atributů) může být téměř libovolný smysluplný tisknutelný unicodový znak. Pochopitelně na názvy elementů a atributů jsou kladena jistá (celkem standardní) omezení.
Konkrétně (vaše vlastní) názvy nesmí začínat na libovolně zkapitalizovanou verzi řetězce xml
, kromě označení jmenného prostoru nesmí obsahovat dvojtečku a název smí začínat (a z větší části obsahovat) pouze na „písmeno“.
Komplikovanější varianta:
Následující dva znaky jsou klíčové syntaktické prvky XML, a pokud se mají objevit v jeho obsahu (textu), musí být náležitým způsobem odiskejpovány:
<
&
Z důvodů symetrie a použití ve speciálních případech (např. uvozovky uvnitř uvozovek) jsou definovány i následující iskejp-sekvence:
>
"
'
Kromě toho je možné každý jiný povolený znak zapsat jako tzv. číselnou entitu pomocí schematu
&#DecimálníČíslo;
respektive&#xHexadecimálníČíslo;
kde uvedené číslo je odkaz do unicodové tabulky na příslušný znak.
To mimo jiné umožňuje používat i znaky, které zrovna nemáte možnost napsat přímo – například japonský znak pro „ookami“ ve všech třech podobách vypadá takto:
Komentáře v XML se zapisují pomocí řídicí sekvence <!--…-->
. Přitom ukončovacím znakem komentáře není sekvence -->
, ale pouze sekvence --
, proto se uvedené dva znaky nesmí nikde v komentáři vyskytnout!
Jelikož komentář kompletně „odstřelí“ svůj vnitřek od procesování pomocí XML-parserů, jsou v něm snad nepřekvapivě povoleny i jinak zakázané znaky <
a &
:
PS: XML-parser může podle svého uvážení komentáře buď zcela zahodit nebo je uživateli poskytnout (typicky jako dále nijak nezpracovaný řetězec).
Specifickým použitím řídicí sekvence <!…>
je blok <![CDATA[…]]>
. Stručně řečeno umožňuje uvnitř sebe zapsat XML jako XML (tj. bez iskejpování), aniž by se ovšem jako XML vyhodnotilo. Narozdíl od XML-komentářů jsou ale CDATA-bloky předávány k dalšímu zpracování. Příklad:
Za uzavírací sekvenci je považován celý řetězec ]]>
, proto se nesmí nikde uvnitř bloku CDATA vyskytnout.
Z historických důvodů (návaznost na SGML) obsahuje standard XML i základní popis jeho struktury pomocí tzv. DTD a způsob, jak tento popis připojit přímo k dokumentu. Toto vše je popsáno pomocí sady speciálních příkazů využívajích také řídicí sekvenci <!…>
, přičemž je vše zanořeno v řídicím „elementu“ <!DOCTYPE …>
.
Jelikož DTD je věnována samostatná kapitola, zde se o něm nebudeme více zmiňovat.
Procesní instrukce <?…?>
(tzv. PIs) se používají ve dvou základních případech:
Ty první z nich je třeba znát a jsou definovány buď přímo ve standardu XML nebo ve standardech s ním souvisejících. Ty druhé se liší aplikaci od aplikace a možná je nikdy ani neuvidíte.
Samotný standard XML definuje jedinou procesní instrukci, a to XML-hlavičku:
Standardy související pak definují další, například:
PS: Celkem pochopitelně byste mohli býti v pokušení hledat procesní instrukci na připojení programu (kupříkladu v jazyce JavaScript). Jenže nic takového není, XML je primárně datový formát. Ovšem pomocí jmenných prostorů se k němu skript přesto přidat dá, a to zápůjčkou z XHTML:
Všechny další možné procesní instrukce už spolupracují přímo s konkrétními aplikacemi, které zpracovávají dané XML, pro jejich význam se tedy musíte podívat tam. Ukázka:
Z předchozího je možná zřejmé, že kontrola správnosti XML-dokumentu je dvoustupňová:
Uvedenou kontrolu zvládá přímo spousta XML-editorů (ať už dedikovaných nebo třeba i typu Emacs) a samozřejmě také spousta dalších externích nástrojů (typicky xmllint, ale třeba i takový Firefox).
Validátor xmllint umí oba výše uvedené kroky (přičemž v tom druhém zvládá validaci proti DTD, RelaxNG, WXS a Schematronu). V tuto chvíli nás bude však zajímat především ten první.
Nejjednodušším způsobem volání je:
Protože však xmllint opisuje na výstup vstupní dokument (za použití některých přepínačů případně nějakým způsobem zpracovaný), je ve většině základních použití lepší zavolat kontrolu takto:
Zobrazit nějakým způsobem XML zahrnuje také dva kroky:
Zatímco první požadavek splňují všechny webové prohlížeče (a většina nástrojů pro zpracování XML vůbec), druhého se drží čestná (a v tomto případě nepříliš užitečná) výjimka Safari. Všechny ostatní prohlížeče se shodly na tom, že chce-li uživatel (člověk!) vidět XML, bude ho spíše zajímat jeho (téměř) skutečná struktura, a proto aplikují na XML jistý výchozí způsob zobrazování.
Díky na předchozím slajdu popsanému chování můžeme webové prohlížeče s výhodou použít pro jednodušší základní kontrolu XML-dokumentů. Kupříkladu Mozilla Firefox zobrazí XML bez chyb (při nejmenším ve smyslu well-formed) takto..
..a v případě nějaké chyby vrátí hlášení o ní: