Ačkoliv je XML pro mnohé nedotknutelnou modlou, konsorcium W3C si to rozhodně nemyslí a připravilo pro nás v únoru dva nové dokumenty, třetí edici doporučení XML 1.0 a novinku XML 1.1. V tomto článku se o těchto nových standardech dozvíte více.

Standard XML je bezesporu nejúspěšnějším dokumentem, který kdy vzešel z pera konsorcia W3C. Jeho použití je skutečně univerzální, ať už mluvíme třeba o jeho aplikacích používaných na internetu (XHTML, SVG,…) nebo jako o formátu pro ukládání dat. Doporučení XML ve verzi 1.0 je dnes natolik rozšířený standardem, že jakékoliv rozsáhlejší zásahy do něj by byly jistě velmi kontroverzní. Naštěstí je tento standard vytvořen natolik kvalitně, že žádné rozsáhlejší změny nevyžaduje a je otázkou, zdali by byly vůbec přijaty.

Přesto nelze říci, že se doporučení XML nijak nevyvíjí. Právě naopak. V průběhu února vydalo konsorcium W3C dvě nová doporučení (Recommendation): XML 1.0 third edition a XML 1.1. V tomto článku se na tyto novinky důkladně podíváme a ukážeme si, že z nich nemusíme mít vůbec žádný strach.

XML 1.0 potřetí

Jak už to tak bývá, nic není dokonalé. Přestože XML je výborně navrženo, nevyhly se mu některé chyby. Jeho druhá edice opravující chyby původního XML 1.0 vyšla 6.1.2000. O čtyři roky později zde máme nejnovější třetí edici.

Na tomto dokumentu toho není z hlediska změn nic moc zajímavého. Nově jsou v něm používána klíčová slova jako MUST, MUST NOT, SHOULD,… a opraveny jsou chyby, které nebyly eliminovány v druhé edici. Nejdůležitější je zdůraznit, že tato edice nijak nemění samotnou logiku doporučení, pouze opravuje chyby v dokumentu. Pokud tedy řekneme, že dokument je platný dle XML 1.0, pak to znamená, že odpovídá požadavkům této třetí edice, která je považována za jediné platné znění XML 1.0 doporučení.

XML 1.1

Konsorcium W3C vydalo doporučení XML 1.1 souběžně s třetí edicí XML 1.0 4.2.2004. Přestože jde, jak jsem již říkal, o extrémně důležitý standard, nestrhla se okolo jeho nové verze žádná bouře diskuzí. Naopak se zdá, že naopak všechny nechává verze 1.1 v klidu. V následujících odstavcích se podíváme, proč tomu tak je.

Proč vlastně potřebujeme další XML?

Základním rysem XML je skutečnost, že pracuje s textovými dokumenty. Jednoduše řečeno, je to v podstatě soubor pravidel určujících, zdali je daný dokument správně formulovaný (well formed) XML dokumentem. Základní nevýhodou textových dokumentů (a přenášení textových informací obecně) je problematika kódování jednotlivých znaků a znakových sad. Konsorcium W3C se snažilo svůj formát XML na tuto problematiku připravit, a proto k dosažení co nejlepší přenositelnosti a použitelnosti standardu XML stavělo na standardu Unicode.

Zde ovšem nastává potíž a najdeme tady skutečný důvod, proč muselo vzniknout XML 1.1 doporučení. V době vzniku úplně prvního XML 1.0 (first edition) existovala množina znaků Unicode 2.0. (XML 1.0 third edition bere na vědomí Unicode 3.0). Konsorcium W3C samozřejmě správně předpokládalo, že standard Unicode se bude dále rozšiřovat, proto do standardu XML 1.0 vložilo důležitý odstavec:

Definition: A character is an atomic unit of text as specified by ISO/IEC 10646:2000. Legal characters are tab, carriage return, line feed, and the legal characters of Unicode and ISO/IEC 10646. The versions of these standards cited in A.1 Normative References were current at the time this document was prepared. New characters may be added to these standards by amendments or new editions.

Z tohoto textu by se zdálo, že XML 1.0 je na přidávání nových znaků do množiny Unicode dobře připraveno. Pravda je to ovšem pouze napůl. Zároveň byly definovány poměrně striktně množiny znaků, které jsou použitelné např. ve jménech elementů a atributů. Výsledkem tohoto zmatku je stav, kdy obsah elementů a hodnoty atributů mohou obsahovat libovolný znak Unicode, zatímco jména elementů a atributů mohou obsahovat pouze omezenou množinu znaků, která nerespektuje nově přidávané znaky.

Podívejme se na některé definice z XML 1.0, které by nám měly celý tento problém lépe osvětlit. Nejdříve se podívejme na definici znaku:

Char ::= #x9 | #xA | #xD | [#x20-#xD7FF] | [#xE000-#xFFFD] | [#x10000-#x10FFFF]

Mezi znaky se počítá tabulátor, znaky CR, LF a pak téměř kompletní rozsah Unicode od znaku s hexadecimálním kódem 20h (tedy decimálně 32, což je mezera). Oproti tomu řetězcová kategorie Name, které musí odpovídat názvy atributů i elementů, je definována mnohem přísněji:

Name ::= (Letter | ‚_‘ | ‚:‘) (NameChar)*
NameChar ::= Letter | Digit | ‚.‘ | ‚-‚ | ‚_‘ | ‚:‘ | CombiningChar | Extender

Kategorie Name podle XML 1.0 musí začínat podtržítkem, dvojtečkou nebo znakem z množiny Letter a za tímto počátečním znakem následuje libovolná posloupnost znaků z množiny NameChar. Samotná množina NameChar obsahuje tečku, pomlčku, podtržítko, dvojtečku a znaky z množin Letter, Digit, CombiningChar, Extender. Jak vidíte, nikde se zde nemluví o množině Char, ale vždy o jiných množinách. Ty jsou dále v XML 1.0 definovány na základě Unicode poměrně striktně, takže žádné jiné znaky, přidané do Unicode později, do těchto množin nenáležejí. A zde je skutečný důvod, proč musela vzniknout první revize XML. Doporučení XML 1.1 reaguje na přidávání nových znaků do standardu Unicode a narozdíl od svého předchůdce je připraveno na výskyt nových znaků i v kategorii Name.

Rozlišujeme verze XML

Verzi XML určíme v deklaraci XML na začátku dokumentu pseudoatributem encoding. V XML 1.0 není tato deklarace povinná, v XML 1.1 již nutná je. Následující text je platným XML 1.1 dokumentem:

<?xml version=“1.1″?>
<doc>…tělo dokumentu…</doc>

Zatímco v následujícím případě jde pouze o dobře formulovaný XML 1.0 dokument (v obou případech předpokádám kódování UTF-8):

<doc>…tělo dokumentu…</doc>

Jména v XML nově

Nyní se konečně dostáváme k tomu, co je v XML 1.1 nového. Jak již bylo naznačeno, kategorie znaků jsou úplně předefinovány:

Char ::= [#x1-#xD7FF] | [#xE000-#xFFFD] | [#x10000-#x10FFFF]
NameStartChar ::= „:“ | [A-Z] | „_“ | [a-z] | [#xC0-#xD6] | [#xD8-#xF6] | [#xF8-#x2FF] | [#x370-#x37D] | [#x37F-#x1FFF] | [#x200C-#x200D] | [#x2070-#x218F] | [#x2C00-#x2FEF] | [#x3001-#xD7FF] | [#xF900-#xFDCF] | [#xFDF0-#xFFFD] | [#x10000-#xEFFFF]
NameChar ::= NameStartChar | „-“ | „.“ | [0-9] | #xB7 | [#x0300-#x036F] | [#x203F-#x2040]
Name ::= NameStartChar (NameChar)*

Tento strohý zápis určuje nejdůležitější množiny znaků v XML 1.1. Každé jméno (elementu, atributu) začíná znakem z množiny NameStartChar a pokračuje libovolnou sekvencí znaků z množiny NameChar, která kromě znaků z NameStartChar obsahuje i některé další znaky jako pomlčku, tečku, číslice a některé další. Jak lze z těchto definic vyčíst, rozsah povolených znaků je mnohem větší a předem počítá i s nově přidávanými znaky.

Konce řádků

Věčným problémem textových dokumentů je reprezentace konce řádku. Toho se dosahuje na obvyklých systémech pomocí kombinace znaků CR, LF, respektive jednoho z nich (hexadecimálně 0xA, 0xD). Do tohoto seznamu se přidává nově i znak NEL (0x85) definovaný společností IBM a také znak 0x2028 definovaný přímo standardem Unicode jako oddělovač řádků.

Kompatibilita?

Pravděpodobně nejožehavějším tématem je kompatibilita. Již z předchozího textu je zřejmé, že dokumenty napsané v XML 1.1 nemusí být zpětně kompatibilní s XML 1.0. Je to dáno především tím, že XML 1.1 dokument může obsahovat např. ve jméně elementu znaky, které jsou ve verzi 1.0 zakázány. Tento směr nekompatibility asi nikoho příliš napřekvapí. Otázkou je, zdali každý dokument napsaný v XML 1.0 je zároveň platným dokumentem XML 1.1? Ani zde překvapivě není zaručena 100% kompatibilita. XML 1.1 nově definuje množinu RestrictedChar, která je podmnožinou množiny Char. Jsou v ní znaky, které jsou platnými XML 1.1 znaky, ale nesmí se objevit v textu přímo, nýbrž přes znakovou referenci. Množina RestrictedChar je definována takto:

RestrictedChar ::= [#x1-#x8] | [#xB-#xC] | [#xE-#x1F] | [#x7F-#x84] | [#x86-#x9F]

Problematické jsou znaky z rozmezí [#x7F-#x84] a [#x86-#x9F]. Tyto znaky se v XML 1.0 dokumentu mohly vyskytovat přímo, zatímco v XML 1.1 pouze jako reference. Jde sice o speciální řídící znaky, které se ve vašem dokumentu asi jen tak neobjeví, přesto právě ony mohou teoreticky způsobit porušení zpětné kompatibility XML.

Normalizace dokumentu

Poslední novinkou v XML 1.1 je textový algoritmus označovaný jako normalizace dokumentu. Již v XML 1.0 jste se mohli setkat s pojmem normalizace, ale pouze ve vztahu k hodnotám atributů. Byla to množina instrukcí, která převáděla hodnotu atributu do normalizovaného stavu. Aplikace pracující s XML mají za povinnost tuto normalizaci prováděť a až poté dále pracovat s danou hodnotou. Takto se poté mnohem lépe vykonávají operace nad hodnotami atributů, např. porovnávání.

XML 1.1 však jde ještě dále a nabízí algoritmus normalizace pro celý dokument. Narozdíl od normalizace na úrovni atributů však tento krok není povinný. Tato normalizace by měla podobně jako v předchozím případě především usnadnit textové porovnávání dokumentů.

Není se čeho obávat

Jak jsme si ukázali, v případě příchodu 1.1 verze XML se není vůbec čeho obávat. Naše již vytvořené dokumenty budou až na skutečné výjimky zároveň platnými XML 1.1 dokumenty. Změny mezi verzemi nejsou nijak podstatné a v podstatě řeší hlavně problém s rozšiřováním standardu Unicode. Otázkou zůstává, v jaké verzi XML nyní své dokumenty publikovat. Podle mého názoru není vůbec nutný nějaký zbrklý přesun k XML 1.1. Pokud nejste nuceni použít XML 1.1 např. aplikací pracující s vaším dokumentem nebo potřebou použít nové znaky i ve jménech, je využití XML 1.0 naprosto dostačující.

Starší komentáře ke článku

Pokud máte zájem o starší komentáře k tomuto článku, naleznete je zde.

Žádný příspěvek v diskuzi

Odpovědět