Podcast on XML Schema Definition (XSD) Guide

XML Schema Definition (XSD) Guide for Students

Podcast

XML Schéma: Stavební plán pro vaše data0:00 / 15:07
0:001:00 zbývá
SamPředstavte si studenta, říkejme mu Alex. Celou noc pracoval na projektu, konečně odevzdal svůj XML soubor a… chyba. Systém mu napsal jen "Neplatný formát dat" a Alex vůbec netušil, co udělal špatně.
HannahAch, tenhle pocit bezmoci znám. Je to jako snažit se sestavit nábytek bez návodu. Máte všechny díly, ale nevíte, jak patří k sobě.
Chapters

XML Schéma: Stavební plán pro vaše data

Délka: 15 minut

Kapitoly

Proč potřebujeme pravidla?

Co je to XSD?

Jak to funguje v praxi?

Kouzlo jmenných prostorů

Stavební kameny: simpleType a complexType

Nastavení přísnějších pravidel

Skládání struktur s complexType

Způsoby návrhu schémat

Shrnutí

Přepis

Sam: Představte si studenta, říkejme mu Alex. Celou noc pracoval na projektu, konečně odevzdal svůj XML soubor a… chyba. Systém mu napsal jen "Neplatný formát dat" a Alex vůbec netušil, co udělal špatně.

Hannah: Ach, tenhle pocit bezmoci znám. Je to jako snažit se sestavit nábytek bez návodu. Máte všechny díly, ale nevíte, jak patří k sobě.

Sam: Přesně! A přesně proto jsme tady. Abychom se podívali na ten "návod" pro XML. Tohle je Studyfi Podcast.

Sam: Takže, Hano, Alexův problém nebyl v tom, že by jeho XML bylo technicky rozbité, že?

Hannah: Správně, Same. Jeho soubor byl pravděpodobně "dobře formátovaný" neboli well-formed. To znamená, že dodržel základní syntaxi XML – každý tag měl svůj uzavírací tag, atributy byly v uvozovkách a tak dále.

Sam: Tak v čem byl tedy problém?

Hannah: Problém byl v tom, že nebyl "validní". A to je ten klíčový rozdíl. Validní dokument nejenže dodržuje syntaxi, ale také se řídí konkrétní strukturou a pravidly, která pro něj byla definována.

Sam: Takže mu chyběl ten návod. A ten návod se v našem případě jmenuje XML Schéma?

Hannah: Přesně tak! XML Schema Definition, zkráceně XSD, je soubor, který funguje jako stavební plán nebo gramatická příručka pro váš XML dokument. Říká přesně, jaké elementy tam mohou být, v jakém pořadí, kolikrát a jaký typ dat mají obsahovat.

Sam: Dobře, takže XSD je takový vyhazovač u dveří klubu jménem "Validní XML". Kontroluje, jestli má každý správnou pozvánku.

Hannah: To je skvělé přirovnání! A je to velmi mocný vyhazovač. Na rozdíl od starší technologie zvané DTD, která byla spíš jen seznamem hostů, XSD je jako detailní bezpečnostní manuál.

Sam: Co tím myslíš? V čem je XSD lepší než DTD?

Hannah: XSD má několik velkých výhod. Zaprvé, je napsané v XML. Nemusíte se učit novou syntaxi. Zadruhé, je mnohem silnější v definování datových typů.

Sam: Datové typy? Jako v programovacích jazycích?

Hannah: Přesně. V DTD jste mohli říct jen to, že něco je text. V XSD můžete specifikovat, že to musí být celé číslo, desetinné číslo, datum, nebo třeba e-mailová adresa. Můžete dokonce definovat vlastní formáty.

Sam: Aha, takže už žádné vkládání "nevím" do pole pro věk.

Hannah: Přesně tak. XSD to nedovolí, pokud mu to explicitně nepovolíte. Zajišťuje to čistotu a spolehlivost dat, což je naprosto klíčové pro jakékoliv další zpracování.

Sam: Dobře, pojďme se na to podívat prakticky. Dejme tomu, že jsem Alex a chci svůj projekt opravit. Co musím udělat?

Hannah: Je to proces o několika krocích. Zaprvé, máš svůj XML soubor s daty. Tomu se říká XML instance.

Sam: Instance, jasně.

Hannah: Zadruhé, vytvoříš samostatný soubor s příponou .xsd. To je tvoje XML Schéma, ten stavební plán.

Sam: Takže dva soubory. Jak ten první pozná, že se má řídit tím druhým?

Hannah: A to je třetí krok – propojení. Přímo v kořenovém elementu svého XML souboru přidáš speciální atributy, které řeknou: "Hej, pravidla pro mě najdeš v tomto XSD souboru."

Sam: A pak už jenom spustím validaci?

Hannah: Přesně. Existuje spousta nástrojů, které vezmou tvůj XML a XSD soubor a zkontrolují, jestli všechno sedí. Pokud ne, řeknou ti přesně kde a proč je chyba. Už žádné hádání jako u Alexe.

Sam: Zmínila jsi propojování. To zní jako něco, kde se dá snadno udělat chyba. Jak to přesně funguje?

Hannah: Funguje to pomocí takzvaných jmenných prostorů neboli namespaces. Představ si to jako příjmení pro elementy.

Sam: Příjmení?

Hannah: Ano. Můžeš mít v různých schématech element se jménem id. Jeden může být id produktu, druhý id zaměstnance. Jmenný prostor jim dá unikátní kontext, jako Novák nebo Svoboda. Takže víš, o kterém id se bavíš.

Sam: Takže v XML souboru řeknu, že se chystám používat jmenný prostor pro instance schémat, a pak mu dám adresu toho mého konkrétního schématu?

Hannah: Přesně. Použiješ atribut xmlns:xsi pro definici, že používáš instance schémat. To je taková konvence. Pak pomocí xsi:schemaLocation řekneš: "Pro jmenný prostor s tímto názvem najdeš definici v souboru moje_schema.xsd."

Sam: Zní to trochu složitě, ale dává to smysl. Je to vlastně takový import knihovny v programování.

Hannah: Perfektní analogie! Přesně tak to je. A ve svém XSD souboru zase definuješ targetNamespace, čímž říkáš: "Všechny elementy, které zde definuji, patří do této rodiny, do tohoto jmenného prostoru."

Sam: Dobře, pojďme se podívat dovnitř toho XSD souboru. Jak definujeme ty stavební kameny? Jak řeknu, že vek má být číslo a jmeno text?

Hannah: Základní rozdělení v XSD je na simpleType a complexType.

Sam: Jednoduchý a složitý typ. To zní… jednoduše.

Hannah: A ono to tak v podstatě je. simpleType je element, který obsahuje jen textovou hodnotu a nemůže mít žádné vnořené elementy ani atributy. Je to ten nejzákladnější stavební kámen.

Sam: Jako třeba <vek>36</vek> nebo <jmeno>Jan</jmeno>?

Hannah: Přesně. Pro tyto elementy definuješ xs:element s atributy name a type. Například <xs:element name="vek" type="xs:integer"/>. Tím jsi řekla, že element vek musí obsahovat celé číslo.

Sam: A jaké typy máme k dispozici?

Hannah: Je jich spousta! xs:string pro text, xs:decimal pro desetinná čísla, xs:boolean pro true/false, a pak skvělé typy pro datum a čas jako xs:date nebo xs:time. Už nikdy neuložíš datum ve špatném formátu.

Sam: A co atributy, jako třeba <osoba id="123">?

Hannah: Atributy se definují pomocí xs:attribute. Můžeš mu nastavit jméno, typ a také použití – jestli je required (povinný) nebo optional (volitelný).

Sam: Můžu mu dát i výchozí hodnotu?

Hannah: Ano! Pomocí default nastavíš hodnotu, která se použije, pokud atribut chybí. A pokud použiješ fixed, tak ten atribut musí mít přesně tu danou hodnotu a žádnou jinou.

Sam: Co když mi základní datové typy nestačí? Co když chci, aby třeba element stav mohl mít jen hodnoty "nový", "v procesu" nebo "dokončený"?

Hannah: Skvělá otázka! K tomu slouží restrikce neboli xs:restriction. Uvnitř definice elementu můžeš omezit základní typ.

Sam: Takže vezmu xs:string a řeknu mu, že přijímá jen pár vybraných slov?

Hannah: Přesně. Pro tvůj příklad bys použila xs:enumeration. To je v podstatě seznam povolených hodnot. Cokoliv jiného validátor odmítne.

Sam: To je super užitečné. A co další omezení? Třeba délka textu?

Hannah: Samozřejmě. Máš k dispozici minLength, maxLength a length pro přesnou délku. Pro čísla zase minInclusive, maxInclusive a další pro nastavení rozmezí.

Sam: Takže můžu říct, že PSČ musí mít přesně 5 číslic.

Hannah: Dokonce ještě lépe! Pro takové případy je nejlepší xs:pattern, který umožňuje definovat přesnou masku pomocí regulárních výrazů.

Sam: Regulární výrazy. Vypadají jako by je psal někdo, kdo se zrovna naštval na klávesnici.

Hannah: Vypadají děsivě, ale jsou neuvěřitelně mocné. Regulárním výrazem můžeš definovat formát pro rodné číslo, SPZ auta nebo třeba ten tvůj pětimístný PSČ. Je to ultimátní nástroj pro validaci formátu.

Sam: Dobře, slibuji, že se na ně podívám. A ještě jedna věc, co mezery a odřádkování? Počítá se to do délky?

Hannah: I na to XSD myslí. Máš tag whiteSpace, který může mít tři hodnoty: preserve nedělá nic, replace nahradí tabulátory a odřádkování mezerou a collapse navíc zredukuje vícenásobné mezery na jednu jedinou. To je skvělé pro čištění vstupů.

Sam: Takže simpleType jsou cihly. Co je tedy complexType? Dům?

Hannah: Přesně tak! complexType je element, který může obsahovat další vnořené elementy nebo atributy, nebo obojí. Je to kontejner pro ostatní data.

Sam: Jako třeba element <osoba>, který by obsahoval <jmeno> a <prijmeni>?

Hannah: Ano. A tady přichází na řadu další důležité tagy, které určují strukturu uvnitř complexType. Jsou to xs:sequence, xs:choice a xs:all.

Sam: Sekvence, výběr, všechno. Co dělají?

Hannah: xs:sequence znamená, že vnořené elementy musí být přesně v daném pořadí. Nejdřív jméno, pak příjmení. Přeházení by způsobilo chybu validace.

Sam: Jako v receptu. Nejdřív mouka, pak vajíčka.

Hannah: Přesně. xs:choice naopak znamená, že můžeš použít právě jeden z nabízených elementů. Například v elementu <kontakt> bys měl na výběr mezi <email> a <telefon>.

Sam: A xs:all?

Hannah: xs:all říká, že všechny uvedené elementy se tam musí objevit, ale na jejich pořadí nezáleží. To je spíš jako když si balíš kufr, je jedno co tam dáš dřív, hlavně aby tam bylo všechno.

Sam: To dává smysl. A co počty? Může mít jedna osoba více telefonních čísel?

Hannah: Určitě. U každého elementu můžeš použít atributy minOccurs a maxOccurs. Výchozí hodnota pro oba je 1. Ale můžeš nastavit minOccurs="0" pro volitelný element, nebo maxOccurs="unbounded" pro neomezený počet výskytů.

Sam: Takže pro ta telefonní čísla bych dal minOccurs="0" a maxOccurs="unbounded". To znamená nula až nekonečno čísel.

Hannah: Jsi skvělý student! Přesně tak.

Sam: Když teď znám všechny tyhle nástroje, jak to celé poskládat dohromady? Existují nějaké osvědčené postupy, jak psát XSD?

Hannah: Ano, existují takzvané návrhové vzory. Tři nejznámější jsou Matrjoška, Salámová metoda a Benátské žaluzie.

Sam: To zní jako jídlo a dekorace do bytu. Jsem zvědavý.

Hannah: Matrjoška, nebo Russian Doll, je nejintuitivnější. Struktura tvého XSD přesně kopíruje strukturu XML. Deklarace elementů jsou vnořené do sebe, stejně jako panenky matrjošky. Je to čitelné, ale méně znovupoužitelné.

Sam: Chápu. Všechno je definované lokálně, přímo na místě.

Hannah: Přesně. Oproti tomu je tu Salámová metoda, neboli Salami Slice. Tady si všechny elementy, i ty nejmenší, nadefinuješ globálně jako jednotlivé plátky salámu. A pak je ve struktuře jenom skládáš dohromady pomocí reference.

Sam: Takže definuju <jmeno> a <prijmeni> jednou a pak je můžu použít v elementu <student>, <ucitel> nebo kdekoliv jinde?

Hannah: Ano! To je velká výhoda. Maximální znovupoužitelnost. A třetí vzor, Benátské žaluzie, je takový hybrid. U něj se globálně definují celé datové typy.

Sam: Jak to myslíš?

Hannah: Vytvoříš si vlastní complexType s názvem třeba osobaInfo, který bude obsahovat jméno a příjmení. A pak můžeš vytvořit element <zakaznik> typu osobaInfo a element <zamestnanec> taky typu osobaInfo. Definuješ strukturu jednou a používáš ji pro různé elementy.

Sam: To zní jako nejlepší z obou světů. Čitelnost a znovupoužitelnost.

Hannah: Přesně tak. Každý vzor má své místo, ale Benátské žaluzie jsou často považovány za nejelegantnější řešení pro větší a složitější schémata.

Sam: Páni, to bylo hodně informací. Pojďme si to rychle shrnout pro Alexe a všechny ostatní, kteří poslouchají.

Hannah: Dobře. Takže, XML Schéma neboli XSD je soubor pravidel, takový stavební plán, pro vaše XML dokumenty. Zajišťuje, že data jsou nejen dobře formátovaná, ale i validní.

Sam: Říká nám, jaké elementy a atributy můžeme použít, v jakém pořadí, kolikrát a jaký mají mít datový typ. To je mnohem víc, než uměla starší technologie DTD.

Hannah: Přesně. Základními stavebními kameny jsou simpleType pro jednoduché hodnoty a complexType pro struktury, které obsahují další elementy a atributy.

Sam: Pomocí restrikcí můžeme hodnoty dále omezovat – ať už jde o seznam povolených hodnot, délku textu nebo složité formáty pomocí regulárních výrazů.

Hannah: A nakonec, strukturu v complexType řídíme pomocí xs:sequence pro pevné pořadí, xs:choice pro výběr jedné z možností a xs:all pro libovolné pořadí.

Sam: A když to všechno poskládáme dohromady podle jednoho z návrhových vzorů, jako je Matrjoška nebo Salámová metoda, získáme robustní a spolehlivou definici pro naše data. Alex už nikdy nemusí hádat, kde udělal chybu.

Hannah: Přesně tak! S XSD máte v rukou mocný nástroj pro zajištění kvality a konzistence dat. A to je k nezaplacení.

Sam: Skvělé. Děkuji ti moc, Hano, za vysvětlení. A vám děkujeme za poslech. Učte se dobře a brzy zase na slyšenou u dalšího dílu Studyfi Podcast!