Kapitola 1. Moderní značkovací jazyky a jejich aplikace

Obsah

Úvod do XML, odkazy na specifikace
Úvod, definice, motivace, historie,…
Jazyky rodiny SGML a jejich aplikace (HTML)
Extensible Markup Language (XML)
Extensible Markup Language (XML) - další odkazy, zejména na software
Charakteristika a základní zásady XML
Charakteristika XML jazyků
Základní specifikace: XML 1.0 (Third Edition)
Deset zásad pro specifikaci XML standardů
Struktura XML dokumentů
Syntaxe XML dokumentů
Fyzická a logická struktura XML dokumentu
Elementy
Elementy - prázdné
Atributy
Atributy - zápis
Atributy - příklad
Textové uzly
Instrukce pro zpracování
Notace
Komentáře
Entity
Podrobněji...
Specifikace XML 1.1
XML 1.0 (Third Edition)
XML - další tutoriály a články
Terminologie
Terminologie
Terminologie - opakování (2)
Terminologie - opakování (3)
Znaky v XML dokumentech
Znaky v XML dokumentech
Standardy Unicode, ISO 10646
Kódování Unicode
Znaky v XML dokumentech
Document Type Definition (DTD)
Document Type Definition (DTD)
DTD - tutoriály
DTD - deklarace typu dokumentu podrobněji
DTD - podmíněné sekce
DTD - definice typu elementu
DTD - definice atributu
DTD - definice typu hodnoty atributu
DTD - předpis kardinality (počtu výskytů) atributu
DTD - implicitní hodnota atributu
Fyzická struktura (entity)
Entita - deklarace a použití
Entity obecné (general) - mohou být
Entity parametrické (parametric)
Jmenné prostory
Jmenné prostory (XML Namespaces)
Prefixy jmenných prostorů, shoda...
Příklad implicitního jmenného prostoru
Příklad explicitního jmenného prostoru
Obtíže se jmennými prostory
XML Base
XML Base
XML Base - příklad
XML Inclusions
XML Inclusions (XInclude)
XInclude: použití
XInclude: příklad
XML Catalogs
XML Catalogs
XML Catalogs - příklad
XML Information Set
XML Information Set (XML Infoset) - cíle
XML Infoset - struktura
Kanonický tvar XML
Kanonický tvar XML dokumentu
Kanonický tvar - zásady konstrukce
Potíže při definici kanonického tvaru
Základní pojmy
Cílem rozhraní je
Hlavní typy rozhraní pro zpracování XML dat:
Stromově orientovaná rozhraní (Tree-based API)
Mapují XML dokument na stromovou strukturu v paměti
Modely specifické pro konkrétní prostředí
Rozhraní založená na událostech (Event-based API)
Při analýze ("parsing") dokumentu "vysílají" zpracovávající aplikaci sled událostí.
Událostmi je např.:
SAX - příklad analýzy dokumentu
Kdy zvolit událostmi řízené rozhraní?
Vlastnosti (features) nastavitelné pro analýzu - parsing
SAX filtry
Další odkazy k SAX
Rozhraní založená na technice "pull"
Rozhraní založená na technice "pull"
Streaming API for XML (StAX)
StAX - příklad s iterátorem
StAX - příklad s kurzorem
Document Object Model (DOM)
Základní rozhraní pro tvorbu a přístup ke stromové reprezentaci XML dat.
Specifický DOM pro HTML dokumenty
Odkazy k DOM
Implementace DOM
Alternativní stromové modely - XOM
Alternativní parsery a stromové modely - NanoXML
Prakticky dobře použitelný stromový model: dom4j
Kombinace stromových a událostmi řízených přístupů
Události -> strom
Strom -> události
Virtuální objektové modely
Cíle a charakteristiky jazyků schémat
Cíle modelování XML dat
Přístupy k modelování XML dat
Kategorie jazyků schemat
Modelování pomocí gramatik
Modelování pomocí dědičnosti
Modelování pomocí vzorů
Funkcionální modelování
XML Schema
XML Schema - základní zdroje informací
XML Schema - motivace
XML Schema - hlavička definice schématu
XML Schema - přiřazení typu elementu s daným názvem
XML Schema - definice jednoduchého typu
XML Schema - definice jednoduchého typu - příklad 1
XML Schema - definice jednoduchého typu - příklad 2
XML Schema - jednoduché typy - "union"
XML Schema - jednoduché typy - seznam hodnot
XML Schema - definice složeného typu
XML Schema - definice složeného typu - skupiny
XML Schema - definice složeného typu - skupiny atributů
XML Schema - použití skupin
XML Schema - kompozitor "sequence"
XML Schema - kompozitor "choice"
XML Schema - kompozitor "all"
XML Schema - jednoduchý obsah elementu
XML Schema - smíšený obsah elementu
XML Schema - další možnosti
XML Schema - anotace schémat
XML Schema - znovupoužití definice schématu
XML Schema - abstraktní a konečné typy
XML Schema - jmenné prostory
XML Schema - nespecifikované elementy a atributy
XML Schema - odkaz na definici schématu
Relax NG
Relax NG - motivace
Relax NG - základní zdroje informací
Jazyky schémat používající vzory
Schematron
Examplotron
Ostatní jazyky schémat
DSD 2.0
Vyjadřovací síla těchto modelů, jejich nedostatky
Nástroje na validaci XML dat modelovaných podle těchto standardů
XML Linking Language (XLink)
XLink - úvod
XML Linking Language (XLink) - původ standardu
XLink - historie a motivace
Výhody odkazové infrastruktury na bázi XLink
Specifikace, tutoriály
XLink - základní principy
Integrace XLinku do (schémat) dokumentů
XLink - základní typy
Simple XLink odkaz
Extended XLink odkaz
Příklad odkazu XLink (1) - jednoduchý XLink
Příklad odkazu XLink (2) - rozšířený XLink
Sémantika odkazů XLink
Chování aplikací nad odkazy XLink
Upřesnění role odkazu pro aplikace
Upřesnění role odkazu pro člověka
Použití XLink a implementace procesorů XLink
Procesory XLink
Prohlížeče
Příčiny nízkého rozšíření
Alternativy k XLink
HLink
VELLUM
VELLUM - přednosti a nedostatky
VELLUM - ukázka
VELLUM - ukázka (2)
VELLUM - ukázka (3)
VELLUM - srovnání s RDF
Odkazy na další zdroje
XPointer
XML Pointer Language (XPointer)
Aktuální specifikace skupiny XPointer
XPointer - terminologie
pojem Point
pojem Range
pojem Location
XPointer - ukázky
XPointer - ukázka (1)
XPointer - ukázka (2)
Zvon XPointer Tutorial
Jazyk XSLT
Souvislosti, historie
Hlavní principy
Hlavní informační zdroje - specifikace, reference, tutoriály, FAQ
Syntaxe XSLT
Struktura celého XSLT stylu
XSLT šablony
Sémantika XSLT
XSLT - postup zpracování vstupního dokumentu
XSLT - pořadí volání šablon
XSLT - specifikace výstupu/"výsledku" šablony
XSLT - výstup textových uzlů
Implicitní šablony
Přehled implicitních šablon
Přehled implicitních šablon (2)
Vybrané XSLT konstrukce podrobněji
Generování pevně daného elementu s atributy
Generování elementu s kalkulovaným názvem i atributy
Řízení chodu transformace uvnitř šablony - větvení
Řízení chodu transformace uvnitř šablony - vícecestné větvení
Řízení chodu transformace uvnitř šablony - cykly
Pokročilá témata
Režimy (módy) zpracování
Deklarace a volání pojmenovaných šablon
Automatické (generované) číslování
Automatické číslování (2)
Co používat raději?
Znovupoužitelnost stylů
Návrhové vzory
Odkazy na pokročilá témata
Základní problémy efektivního ukládání a zpracování XML dat
Základy efektivního ukládání XML dat
Rozhraní pro práci s XML databázemi
Rozhraní XML:DB
Vrstvy XML:DB API
Ukázka XML:DB programu
Použití XUpdate v databázích s XML:DB
Implementace XML:DB rozhraní
Apache Xindice
Ukázka interakce s Xindice
Ukázka interakce s Xindice (2)
Ukázka interakce s Xindice (3)
eXist
eXist: instalace a spuštění
eXist: použití přes webové rozhraní
eXist: vložení dokumentu do kolekce
eXist: dotazování - zadání dotazu
eXist: dotazování - sumarizovaný výsledek dotazu
eXist: dotazování - prohlížení jednotlivých výsledků dotazu
Úvod k formátování
DocBook: příklad složitějšího značkování
DocBook: vrstvy a přizpůsobení
DocBook: styly
Konceptuální, logické a fyzické formátování
Co a k čemu je formátování?
Úrovně formátování
Odkud kam sahají úrovně formátování?
Fáze formátování
Postup formátování a příklady nástrojů
data -> požadovaná data (filtrace)
filtrovaná data -> konceptuální formát
Konceptuální formát -> logický formát
Logický formát -> fyzický formát
Formátování a výstupní média
Výstup na běžnou obrazovku, web (HTML, plaintext, RTF)
(X)HTML, RTF, plaintext (2)
Výstup pro tisk (PDF, TeX)
Výstup na malé displeje (WAP, PDA)
Hlasový výstup (VoiceXML)
Podrobněji k formátovacím objektům (XSL:FO)
Co a k čemu jsou XSL:FO
Informační zdroje k XSL:FO
Rámce pro metadata popisující XML a jiné datové zdroje
Rámec RDF
RDF Model
RDF Schema
RDF reprezentace užívaných metadatových schémat (Z39.50, Dublin Core atd.)
Dublin Core - příklad konkrétního metadatového schématu
Co je Dublin Core?
Jednoduchý (Simple) Dublin Core
Dublin Core - elementy
DC - příklad metadatového popisu
Kvalifikovaný Dublin Core
Kódování DC v XML
Nástroje pro práci s RDF
Příklady praktického použití metadat - veřejná správa
Rámec pro metadata ISVS ČR
Adaptace Dublin Core pro potřeby veřejné správy
Aplikační profil NMS
Ontologie
Co jsou ontologie?
Aplikace ontologií (Use Cases)
XML Topic Maps

Úvod do XML, odkazy na specifikace

Úvod, definice, motivace, historie,…

  • XML je standard (přesněji doporučení konsorcia W3C) jak vytvářet značkovací jazyky.

  • Jedná se tedy o metajazyk.

  • Ideově vychází ze zhruba o deset let mladšího standardu SGML (Structure Generalized Markup Language).

  • Se základním standardem úzce souvisí několik dalších, např. XML Namespaces, XInclude, XML Base.

  • Tyto spolu s dalšími standardy (XSLT, XSL-FO, XHTML, CSS...) tvoří "rodinu" standardů XML.

Jazyky rodiny SGML a jejich aplikace (HTML)

Extensible Markup Language (XML)

Extensible Markup Language (XML) - další odkazy, zejména na software

Charakteristika a základní zásady XML

Charakteristika XML jazyků

  • XML není jeden konkrétní značkovací jazyk; je to specifikace určující, jak mají vypadat značkovací jazyky

  • jedná se tedy o "metajazyk"

  • konceptuálně jde o zjednodušení SGML standardu, aby se usnadnila práce tvůrcům parserů (analyzátorů) a aplikací

    - například v tom, že každý element musí být uzavřen; pak na přečtení struktury dokumentu nemusíme mít DTD

  • XML navazuje na úspěšnou implementaci SGML - jazyk HTML; má podobné charakteristiky z hlediska zaměření na internet

  • Momentálně je aktuální specifikací Extensible Markup Language (XML) 1.0 (Third Edition) W3C Recommendation 4th February 2004, François Yergeau, Tim Bray, Jean Paoli, C. M. Sperberg-McQueen, Eve Maler

  • Připravuje se XML 1.1, nyní jako Candidate Recommendation.

  • Vážné diskuse se vedou okolo binárního XML, což by měla být rovnocenná reprezentace stejného modelu, jako má "textové" XML.

Základní specifikace: XML 1.0 (Third Edition)

  • Momentálně je aktuální specifikací Extensible Markup Language (XML) 1.0 (Third Edition) W3C Recommendation 4th February 2004, autorů François Yergeau, Tim Bray, Jean Paoli, C. M. Sperberg-McQueen, Eve Maler

  • Současně s tím je zveřejněna XML 1.1, W3C Recommendation, 4th February 2004, François Yergeau, John Cowan, Tim Bray, Jean Paoli, C. M. Sperberg-McQueen, Eve Maler.

  • Vážné diskuse se vedou okolo binárního XML, což by měla být rovnocenná reprezentace stejného modelu, jako má "textové" XML.

Deset zásad pro specifikaci XML standardů

vyňato z preambule ke specifikaci XML 1.0 (Second Edition)

  1. XML shall be straightforwardly usable over the Internet.

    XML bude přímočaře použitelné na Internetu.

  2. XML shall support a wide variety of applications.

    XML bude podporovat širokou škálu aplikací.

  3. XML shall be compatible with SGML.

    XML bude kompatibilní se SGML.

  4. It shall be easy to write programs which process XML documents.

    Tvorba programů zpracovávajících XML bude jednoduchá.

  5. The number of optional features in XML is to be kept to the absolute minimum, ideally zero.

    Počet volitelných prvků XML standardu bude málo, optimálně 0.

  6. XML documents should be human-legible and reasonably clear.

    XML dokumenty by měly být "lidsky" čitelné a rozumně jednoduché.

  7. The XML design should be prepared quickly.

    Návrh XML standardu by měl být rychle hotov.

  8. The design of XML shall be formal and concise.

    Návrh XML musí byt formální a správný.

  9. XML documents shall be easy to create.

    XML dokumenty bude možné snadno vytvořit.

  10. Terseness in XML literal is of minimal importance.

    Úspornost XML značkování není podstatná.

Struktura XML dokumentů

Syntaxe XML dokumentů

Základním požadavkem kladeným na každý XML dokument je, že musí být dobře utvořen (well-formed).

Toto nastane, právě když:

  1. Taken as a whole, it matches the production labeled document: [1] document ::= prolog element Misc* tj. obsahuje prolog (hlavičku) a právě jeden, tzv. kořenový element. Dále může před a po kořenovém elementu obsahovat instrukce pro zpracování, komentáře atd. (Misc)

  2. It meets all the well-formedness constraints given in the specification.

    Musí vyhovovat všem pravidlům pro správné utvoření uvedeným ve specifikaci.

  3. Each of the parsed entities which is referenced directly or indirectly within the document is well-formed.

    Totéž platí pro každou analyzovanou (parsovanou) entitu přímo nebo nepřímo odkazovanou v dokumentu.

Podívejte se na tutoriál základů XML v češtině

Rejstřík (glossary) pojmů ke XML

Fyzická a logická struktura XML dokumentu

U XML dokumentů rozlišujeme strukturu fyzickou a logickou. Aplikační programátory zajímá většinou jen struktura logická, autory obsahu, XML editorů, procesorů, atd. může zajímat i struktura fyzická.

Struktura logická - dokument členíme na elementy (jedne z nich je kořenový - root), jejich atributy, textové uzly v elementech, instrukce pro zpracování, notace, komentáře

Struktura fyzická - jeden logický dokument může být uložen ve více fyzických jednotkách - entitách; vždy alespoň v jedné - tzv. entitě dokumentu - document entity.

Elementy

Jsou objekty ohraničené počáteční a koncovou značkou - start and end tag, např.:

<tagname ...tag_attributes...>
  tag_content 
</tagname>     

Příklad 1.1. Příklad elementu s obsahem (neprázdného)

<body background="yellow">
   <h1>textový uzel - obsah elementu h1</h1>      
   <p>textový uzel - obsah elementu p</p>      
</body>   

Elementy - prázdné

Je-li obsah prázdný (žádné dceřinné elementy ani textový obsah), pak píšeme pouze značku prázdného elementu - empty element tag, např.:

<tagname tag_attributes/>      

Příklad 1.2. Příklad elementu bez obsahu (prázdného)

<hr width='50%'/>    

Atributy

  • Nesou "dodatečné informace" k elementu - např. jeho ID, požadované formátování - styl, odkazy na další elementy...

  • Konceptuálně by bylo možné atributy nahradit elementy, ale z důvodu přehlednosti obvykle používáme obojí.

  • Obsah atributu na rozdíl od obsahu elementu není nijak (na úrovni obecných zásad XML standardů) dále strukturován.

    Občas se u některých značkování vyskytne snaha o strukturaci obsahu atributů, to však obecně vede k více problémům, než řeší...

Atributy - zápis

  • Atribut je tvořen jménem a hodnotou.

  • Atributy zapisujeme do počáteční značky elementu (který může být i prázdný).

  • Hodnota je vždy vložena v uvozovkách či apostrofech a od jména ji dělí znak rovnítka (=).

  • Pro názvy atributů platí stejná omezení jako pro názvy elementů.

  • V rámci jednoho elementu nejsou přípustné dva atributy se stejným jménem.

Atributy - příklad

Příklad 1.3. Atribut 'width' v prázdném elementu

<hr width='50%'/>

Příklad 1.4. Atribut 'border' v neprázdném elementu

<table border='1'>
   <tr><td>jedna</td><td>dve</td></tr>
   <tr><td>tri</td><td>ctyri</td></tr>
</table>

Textové uzly

Nesou textovou informaci.

Např. v následující ukázce je text ahoj! (nikoli celý element em!) textovým uzlem:

<em>ahoj!</em>

Instrukce pro zpracování

Instrukce pro zpracování (processing-instruction) píšeme do značek <?target content>

Informují aplikaci o postupu či nastavení nutném pro zpracování daných XML dat. Nepopisují (nepředstavují) obsah, ale zpracování dokumentu.

<?xsl-stylesheet href="mystyle.xsl">
[Poznámka]Poznámka

href v příkladu neznamená atribut; atributy nejsou u instrukce pro zpracování možné!

Notace

Notace (notation) píšeme do značek <!NOTATION name declaration >

Slouží zejména k popisu binárních (non-XML) entit - např. obrázků GIF, PNG,...

Jde vlastně o deklaraci způsobu zpracování.

Komentáře

Podobně jako v HTML - komentář (comment) píšeme do značek <!-- text komentáře -->

Komentář nebývá obvykle pro zpracování významný, ale záleží na aplikaci - může např. uchovávat značky Servlet-side Includes (SSI)

Parsery by proto měly komentáře zpracovávat - předávat dále.

Např. SAX parsery však tak nečiní!!! (resp. činí až v rozšířené verzi SAX2, v Javě balík org.xml.sax.ext).

Entity

Entita je základní jednotkou fyzické stavby dokumentu. Odpovídá řetězci, souboru...

Parsery by měly entity zpracovávat tak, aby aplikace nemusela o entitách "nic tušit".

Podrobněji...

Podrobné informace k syntaxi se dozvíme v následující kapitole Standardy rodiny XML

Specifikace XML 1.1

XML 1.0 (Third Edition)

XML - další tutoriály a články

Terminologie

Terminologie

  • Opakování: správně utvořený (well formed) dokument

  • Nové: platný (valid) dokument

    Platný podle specifikace znamená přísnější omezení než správně utvořený.

    Obvykle se validitou myslí soulad s DTD (Document Type Definition) dokumentu.

Terminologie - opakování (2)

  • uzel (element, atribut, textový uzel, instrukce pro zpracování, komentář)

  • element

  • atribut

  • textový uzel

  • instrukce pro zpracování

  • komentář

  • dále viz např. Koskův seriál o XML na http://kosek.cz/clanky/swn-xml/index.html

Terminologie - opakování (3)

  • uzel dokumentu

    - ten je nadřazený kořenovému elementu

    - může kromě něj obsahovat též komentáře, instrukce pro zpracování, notaci DOCTYPE atd

  • kořenový element

Znaky v XML dokumentech

Znaky v XML dokumentech

Specifikace povoluje na určitých místech v XML dokumentech (např. název elementu, obsah atributu...) jen některé znaky.

Vzhledem k internacionalizaci a nutnosti zvládnout i exotické jazyky je třeba znát, co se čím myslí.

Musíme rozlišovat:

  • znakové sady (množiny znaků s pořadovými čísly), tj. přiřazení ordinální hodnoty znaku (např. Unicode) a

  • kódování znaků (z dané sady), např. UTF-8, tj. ordinální hodnota znaku se kóduje do posloupnosti bajtů

Standardy Unicode, ISO 10646

Oba standardy se zabývají podobnými problémy: řeší znakové sady s více než 256 znaky.

  • Původní návrh tzv. 16bitového Unicode: až 64 K znaků, stačí pro evropské, nestačí pro světové jazyky (např. dnes frekventovaná čínstina).

  • 32bitový Unicode: pokrývá znaky už "na věky".

V současnosti se z 32bitové škály většinou používá jen tzv. Basic Multilingual Plane (BMP) pokrývající většinu jazyků.

V XML je možné pro názvy (nonterminál kvalifikovaná jména - QName) použít znaky z BMP.

Jinak lze v XML dokumentech používat všechny znaky Unicode.

Kódování Unicode

Všechny aplikace XML (zejména aplikace univerzální, parsery) musejí být schopny zpracovat znaky Unicode bez ohledu na kódování.

Přesto je dobré znát nejběžnější kódování:

  • osmibitová, tradiční: US-ASCII, ISO-8859-2 (ISO Latin 2), Windows-1250 (=Cp1250) - kódování jen vybrané podmnožiny Unicode.

  • UTF-8: kódování všech znaků Unicode, každý znak na 1-6 bajtech, US-ASCII na jednom bajtu, "čeština" na dvou.

  • UTF-16: princip stejný jako UTF-8, ale základní ukládací jednotkou je dvoubajtové slovo (16 bitů)

  • UCS-2: přímé kódování Unicode, čísla znaků z BMP se zapíší přímo jako dva bajty

  • UCS-4: dtto, ale pro celý Unicode a na 4 bajtech - neúsporné, 4 bajty i pro US-ASCII, evropské jazyky...

Pro XML mají klíčový význam UTF kódování, zejména UTF-8 (ale parsery musejí umět obě).

Znaky v XML dokumentech

  • Přípustné jsou jakékoli UNICODE znaky po x10FFFF (kromě xFFFE, xFFFF a rozmezí xD800 - xDFFF).

  • jména (names) musí být složena ze nemezerových znaků: číslice, písmena, . (tečka) - (pomlčka, minus) _ (podtržítko) : a dalších, musí začínat písmenem nebo _ :

  • Kódování těchto UNICODE znaků není podstatné.

  • Jako implicitní - není-li v prologu (hlavičce), např.

    <?xml version="1.0" encoding="Windows-1250"?>

    uvedeno jinak - se používá UTF-8 nebo UTF-16.

  • Rozlišení UTF-8 a UTF-16 se děje pomocí prvních dvou bajtů dokumentové entity (tj. souboru), pomocí tzv. byte-order-mark xFFFE

  • Není-li uvedena, předpokládá se UTF-8, čili UTF-8 je implicitní kódování UNICODE znaků v XML dokumentech.

Teoreticky by tedy bylo možné z obsahu souboru rozpoznat přesně, o jaké kódování se u XML dokumentu jedná...

Document Type Definition (DTD)

Document Type Definition (DTD)

  • Definice typu dokumentu (použití této definice je pak deklarace typu dokumentu)

  • Specifikována přímo standardem XML 1.0

  • Popisuje přípustný obsah elementů, atributů, jejich implicitní (default) hodnoty, definuje použité entity

  • Může být uvedena jako interní nebo externí DTD (internal and external subset) nebo "napůl" - tam i tam.

  • Dokument vyhovující DTD je označován jako valid (platný).

DTD - deklarace typu dokumentu podrobněji

Uvádí se těsně před kořenový elementem konstrukcí

  • <!DOCTYPE jméno-kořenového-elt Externí-ID [ interní část DTD ]>

Interní nebo externí část (internal or external subset) nemusí být uvedena nebo mohou být uvedeny obě.

Externí identifikátor může být buď

  • PUBLIC "PUBLIC ID" "URI" (hodí se pro "veřejná", obecně uznané DTD) nebo

  • SYSTEM "URI" - pro soukromá nebo jiná "ne zcela standardizovaná" DTD ("URI" nemusí být jen URL na síti, může být i jméno souboru, vyhodnocení se děje podle systému, na němž se vyhodnocuje)

Význam interní a externí části je rovnocenný (a nesmí si odporovat - např. dvě definice téhož elementu).

Obsahem DTD je seznam deklarací jednotlivých prvků - elementů, seznamů atributů, entit, notací

DTD - podmíněné sekce

Slouží k "zakomentářování" úseků DTD např. při experimentování.

  • <![IGNORE[ toto se bude ignorovat ]]>

  • <![INCLUDE[ toto se zahrne do DTD (tj. nebude se ignorovat)]]>

DTD - definice typu elementu

Popisuje možný obsah elementu, má formu <!ELEMENT jméno-elementu ... >,kde ... může být

  • EMPTY - prázdný element, může být zobrazen jako <element/> nebo <element></element> - totéž

  • ANY - povolen je libovolný obsah elementu, tj. text, dceřinné elementy, ...

  • může obsahovat dceřinné elementy - <!ELEMENT jméno-elementu (specifikace dceřinných elementů)>

  • může být smíšený (MIXED) - obsahující text i dceřinné elementy dané výčtem <!ELEMENT jméno-elementu (#PCDATA | přípustné dceřinných elementy)*>. Nelze specifikovat pořadí nebo počet výskytů konkrétních dceřinných elementů. Hvězdička za závorkou je povinná - vždy je možný libovolný počet výskytů.

Pro specifikaci dceřinných elementů používáme:

  • operátor sekvence (sequence, follow with) ,

  • operátor volby (výběru, select, choice) |

  • závorky () mají obvyklý význam

  • nelze kombinovat v jedné skupině různé operátory , |

  • počet výskytů dceřinného elementu omezujeme specifikátory "hvězdička", "otazník", "plus" s obvyklými významy. Bez specifikátoru znamená, že je povolen právě jeden výskyt.

DTD - definice atributu

Popisuje (datový) typ, případně implicitní hodnoty atributu u daného elementu.

Má tvar <!ATTLIST jméno-elementu jméno-atributu typ-hodnoty implicitní-hodnota>

DTD - definice typu hodnoty atributu

Přípustné typy hodnot jsou:

  • CDATA

  • NMTOKEN

  • NMTOKENS

  • ID

  • IDREF

  • IDREFS

  • ENTITY

  • ENTITIES

  • výčet hodnot - např. (hodnota1|hodnota2|hodnota3)

  • výčet notací - např. NOTATION (notace1|notace2|notace3)

Atribut (i nepovinný) může mít implicitní hodnotu:

  • "implicitní hodnota" - atribut je nepovinný, ale není-li uveden, chápe se to, jako by měl hodnotu implicitní hodnota

DTD - předpis kardinality (počtu výskytů) atributu

Atributy mohou mít předepsán (povinný) výskyt:

  • #REQUIRED - atribut je povinný

  • #IMPLIED - atribut je nepovinný

  • #FIXED "pevná-hodnota" - atribut je povinný a musí mít právě hodnotu pevná-hodnota

DTD - implicitní hodnota atributu

Atribut (i nepovinný) může mít implicitní hodnotu:

  • "implicitní hodnota" - atribut je nepovinný, ale není-li uveden, chápe se to, jako by měl hodnotu implicitní hodnota

Fyzická struktura (entity)

Entita - deklarace a použití

Rozlišuje se:

  • deklarace

  • reference (tj. použití) dané (již deklarované) entity.

Entity obecné (general) - mohou být

  • parsované - soubory se (správně utvořeným) značkováním,

  • neparsované - např. binární soubory,

  • znakové - znaky, např. &gt; je referencí na znakovou entitu

Entity parametrické (parametric)

  • mohou být použity jen v rámci DTD

  • hodí se při např. deklaracích seznamu atributů (pokud je dlouhý a vícekrát použitý, nahradíme ho referencí na parametrickou entitu)

  • viz např. DTD pro HTML 4.01 - http://www.w3.org/TR/html4/sgml/dtd.html

  • definicí parametrické entity je např. <!ENTITY % heading "H1|H2|H3|H4|H5|H6">

Jmenné prostory

Jmenné prostory (XML Namespaces)

  • XML Namespaces (W3C Recommendation): http://www.w3.org/TR/REC-xml-names

  • Existuje také nové Namespaces in XML 1.1 W3C Recommendation 4th February 2004. Andrew Layman, Richard Tobin, Tim Bray, Dave Hollander

  • Definují "logické prostory" jmen (elementů, atributů) v XML dokumentu.

  • Dávají uzlům ve stromu XML dokumentu "třetí dimenzi".

  • Logickému prostoru jmen odpovídá jeden globálně ("celosvětově") jednoznačný identifikátor, daný URI (URI tvoří nadmnožinu URL).

  • NS odpovídající danému URI nemá nic společného s obsahem nacházejícím se případně na tomto URL ("nic se odnikud automaticky nestahuje" - nedochází k tzv. dereferenci danéhol URI).

Prefixy jmenných prostorů, shoda...

  • V rámci dokumentů se místo těchto URL používají zkratky, prefixy těchto NS namapované na příslušné URI atributem xmlns:prefix="URI".

    Jméno elementu či atributu obsahující dvojtečku se označuje jako kvalifikované jméno, QName.

  • Dva NS jsou stejné, jestliže se jejich URI shodují po znacích přesně (v kódování UNICODE).

  • NS neovlivňují význam textových uzlů.

  • Element/atribut nemusí patřit do žádného NS.

  • Deklarace prefixu NS nebo implicitního NS má platnost na všechny dceřinné uzly rekurentně, dokud není uvedena jiná deklarace "přemapující" daný prefix.

  • Jeden NS je tzv. implicitní (default NS), deklarovaný atributem xmlns=

  • Na atributy se implicitní NS nevztahuje!!!, čili atributy bez explicitního uvedení prefixu nejsou v žádném NS.

Příklad implicitního jmenného prostoru

V následující ukázce je pro celý úryvek platný deklarovaný implicitní jmenný prostor charakterizovaný URI (URL) http://www.w3.org/1999/xhtml

Příklad 1.5. Implicitní jmenný prostor

<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
   <body>
      <h1>Huráááá</h1>
   </body>
</html>

Příklad explicitního jmenného prostoru

V následující ukázce je deklarován a přiřazen prefixu xhtml jmenný prostor charakterizovaný URI (URL) http://www.w3.org/1999/xhtml

Příklad 1.6. Jmenný prostor mapovaný na prefix

<xhtml:html xhtml:xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
   <xhtml:body>
      <xhtml:h1>Huráááá</xhtml:h1>
   </xhtml:body>
</xhtml:html>

Obtíže se jmennými prostory

Dosud ne všechny parsery dokážou rozpoznávat NS. ...i když problémy jsou s tím dnes výjimečné...

NS jsou nekompatibilní s DTD (DTD přísně rozlišuje např. jméno xi:include a include, přestože patří do stejného NS a mají tedy z hlediska aplikace obvykle stejnou interpretaci/význam).

XML Base

XML Base

  • XML Base, W3C Recommendation 27 June 2001: http://www.w3.org/TR/xmlbase/

  • Standard pro vyhodnocování relativních URL v odkazech z/na XML dokumenty.

  • Definuje použití vyhrazeného atributu xml:base označujícího základ pro vyhodnocování relativních URL.

  • Doplňuje se se standardem XLink.

  • Respektuje princip "překrývání" bázové adresy nastavené v nadřazeném elementu.

XML Base - příklad

Příklad 1.7. xml:base určuje základ pro relativní URL

[Poznámka]Poznámka

Všimněte si použití vyhrazeného prefixu xml:

XML Inclusions

XML Inclusions (XInclude)

  • XML Inclusions (XInclude) Version 1.0 W3C Working Draft 10 November 2003, http://www.w3.org/TR/xinclude/

  • XInclude umožňuje vkládání (částí) XML dokumentů do dokumentů.

  • Je ortogonální k entitám (lze použít oboje v rámci jednoho dokumentu, "nevadí si").

  • Nezávislé na DTD (zpracování XInclude probíhá až po validaci)

  • Nezávislé na XML Schema

XInclude: použití

  • Specifikace definuje jmenný prostor a v něm jeden element <xi:include> s atributy:

  • href= - vkládaný dokument

  • parse= - hodnota je buď "text", pak se obsah vkládá jako (neparsovaný) text, nebo "xml", pak se hodnota vkládá jako značkovaný obsah

  • encoding= - v případě encoding="text" specifikuje (je-li to nutné) kódování vkládaného textu

  • a dalšími atributy (xpointer, accept, accept-charset, accept-language...) viz specifikace.

  • Na FI je k dispozici interpret rozšířeného XInclude - xincluder-fi, který umí vkládat části textových souborů.

XInclude: příklad

Příklad 1.8. Vložení textového souboru (jako textového uzlu)

<xhtml:html xhtml:xmlns="http://www.w3.org/1999/xhtml" 
            xml:lang="en" lang="en">
   <xhtml:body>
      <xhtml:h1>Huráááá</xhtml:h1>
      <xi:include xmlns:xi="http://www.w3.org/2001/XInclude" 
                  href="obsah.txt" encoding="Windows-1250"/>
   </xhtml:body>
</xhtml:html>

XML Catalogs

XML Catalogs

  • Vycházejí ze starších SGML katalogů

  • Jde o prostředek, jak se jednotně odkazovat na entity (dokumenty) umístěné na různých systémech na různých místech.

  • Dovoluje také praktické použití identifikátorů URI typu PUBLIC, které neodkazují na žádnou reálnou lokaci na internetu.

  • Existuje několik formátů pro katalogy - bohužel.

XML Catalogs - příklad

Příklad 1.9. Katalog pro styly značkování DocBook Slides

<?xml version="1.0"?>
<catalog xmlns="urn:oasis:names:tc:entity:xmlns:xml:catalog">
<!-- Slides DTD locations -->
<group xml:base="schema/dtd/"
       id="slides-dtd"
       prefer="public">
  <public
    publicId="-//Norman Walsh//DTD Slides Custom V3.1.0//EN"
    uri="slides-custom.dtd"/>

  <public
    publicId="-//Norman Walsh//DTD slides Full V3.1.0//EN"
    uri="slides-full.dtd"/>
</group>

  <rewriteURI
    uriStartString="http://docbook.sourceforge.net/release/xsl/current/"
    rewritePrefix="file:/c:/devel/docbook-xsl-1.62.4/"/>

<!-- Map web references to DocBook 4.2 DTD -->
   <nextCatalog catalog="file:/c:/devel/docbook4.2/catalog.xml" />
</catalog>

XML Information Set

XML Information Set (XML Infoset) - cíle

  • XML Infoset 2nd Edition W3C Recommendation First published.og 24 October 2001, revised 4 February 2004, John Cowan, Richard Tobin, http://www.w3.org/TR/xml-infoset/

  • Infoset popisuje "jaké všechny informace lze o uzlu (elementu, dokumentu, atributu...) získat"

  • Jinými slovy: aplikace by neměla spoléhat na informace z XML dokumentu, které se po analýze (parsingu) neobjeví v Infosetu.

  • Každý správně utvořený XML dokument vyhovující standardu pro jmenné prostory má Infoset.

XML Infoset - struktura

  • Infoset se skládá z Information items

  • Infoset se týká dokumentu s již expandovanými entitami

  • Rozlišuje se infoset dokumentu, elementu, atributu, znaku, instrukci pro zpracování, neexpandované entitě, neanalyzované entitě, notaci

  • Podrobněji viz specifikace.

Kanonický tvar XML

Kanonický tvar XML dokumentu

  • Canonical XML Version 1.0, W3C Recommendation 15 March 2001, http://www.w3.org/TR/xml-c14n

  • Smyslem je popsat kritéria (a algoritmy), které pomohou rozhodnout, zda jsou dva XML dokumenty ekvivalentní, lišící se pouze fyzickou reprezentací (entity, pořadí atributů, kódování znaků)

  • Kanonizace "setře" rozdíly mezi takovými dokumenty, k nimž se analyzátor "bude jistě chovat stejně", tj. z pohledu aplikace jsou totožné.

  • Použití kanonického tvaru je nutné např. u elektronického podpisu XML dat (při výpočtu hodnoty digest).

  • Bylo by možné nad XML dokumenty definovat i jiné relace ekvivalence než je Canonical XML.

Kanonický tvar - zásady konstrukce

Hlavní zásady konstrukce kanonického tvaru XML dokumentu:

  • kódování v UTF-8

  • zlomy řádků (CR, LF) jsou normalizovány podle algoritmu uvedeného v std. XML 1.0

  • hodnoty atributů jsou normalizovány

  • reference na znakové a parsované entity jsou nahrazeny jejich obsahem

  • CDATA sekce jsou nahrazeny jejich obsahem

  • hlavička "xml" a deklarace typu dokumentu jsou odstraněny

  • bílé znaky mimo kořenový element jsou normalizovány

  • jiné bílé znaky (vyjma normalizace zlomu řádků) jsou zachovány

  • hodnoty atributů jsou uvozeny "

  • speciální znaky v hodnotách atributů a textovém obsahu elementů jsou nahrazeny referencemi na entity

  • nadbytečné deklarace jmenných prostorů jsou z každého elementu odstraněny

  • implicitní hodnoty atributů jsou dodány do každého elementu (kde je to relevantní)

  • na pořadí atributů a deklarací jmenných prostorů se uplatní lexikografické řazení

Potíže při definici kanonického tvaru

Ztráta řady informací (typicky pocházejících z DTD):

  • neparsované entity (např. binární entity) jsou po kanonizaci nepřístupné

  • notace

  • typy atributů (vč. implic. hodnot)

Základní pojmy

Cílem rozhraní je

  • poskytnout jednoduchý standardizovaný přístup ke XML datům

  • "napojit" analyzátor (parser) na aplikaci a aplikace navzájem

  • odstínit aplikaci od fyzické struktury dokumentu (entity)

  • zefektivnit zpracování XML dat

Hlavní typy rozhraní pro zpracování XML dat:

  • Stromově orientovaná rozhraní (Tree-based API)

  • Rozhraní založená na událostech (Event-based API)

  • Rozhraní založená na "vytahování" událostí/prvků z dokumentu (Pull API)

Stromově orientovaná rozhraní (Tree-based API)

Mapují XML dokument na stromovou strukturu v paměti

  • dovolují libovolně procházet ("traverse") vzniklý strom;

  • nejznámější je Document Object Model (DOM) konsorcia W3C, viz http://www.w3.org/DOM

Modely specifické pro konkrétní prostředí

Rozhraní založená na událostech (Event-based API)

Při analýze ("parsing") dokumentu "vysílají" zpracovávající aplikaci sled událostí.

  • technicky realizováno jako volání metod ("callback")

  • aplikace poskytuje handlery, které volání zachytávají a zpracovávají

  • událostmi řízená rozhraní jsou "nižší úrovně" než stromová, protože

  • pro aplikaci zůstává "více práce"

  • jsou však úspornější na paměť (většinou i čas), samotná analýza totiž nevytváří žádné „trvalé“ objekty

Událostmi je např.:

  • začátek a konec dokumentu (start document, end document)

  • začátek a konec elementu (start element, end element) - předá současně i atributy

  • instrukce pro zpracování (processing instruction)

  • komentář (comment)

  • odkaz na entitu (entity reference)

  • Nejznámějším takovým rozhraním je SAX http://www.saxproject.org

SAX - příklad analýzy dokumentu

<?xml version="1.0"?>
<doc>
   <para>Hello, world!</para>
</doc>

vyprodukuje při analýze (parsingu) sled událostí:

start document
start element: doc {seznam atributů: prázdný}
start element: para {seznam atributů: prázdný}
characters: Hello, world!
end element: para
end element: doc
end document

Kdy zvolit událostmi řízené rozhraní?

  • O co snazší pro autora parseru, o to náročnější pro aplikačního programátora...

  • Aplikace si musí (někdy složitě) pamatovat stav analýzy, nemá nikdy "celý dokument pohromadě".

  • Na úlohy, které lze řešit "lokálně", bez kontextu celého dokumentu, je to vhodné rozhraní.

  • Obvykle poskytuje nejrychlejší možné zpracování.

  • Aplikační nepříjemnosti lze obejít použitím nadstaveb, např. Streaming Transformations for XML (STX)

Vlastnosti (features) nastavitelné pro analýzu - parsing

Chování parseru produkujícího SAX události je možné ovlivnit nastavením tzv. features a properties.

SAX filtry

SAX rozhraní nabízí možnost napsat třídu jako tzv. SAX filtr (přesněji implementaci rozhraní org.xml.sax.XMLFilter).

Objekt takové třídy na jedné straně události přijímá, zpracuje je a posílá dále.

Další informace k filtrování událostí naleznete např. v článku Change the events output by a SAX stream (IBM DeveloperWorks/XML).

Další odkazy k SAX

Rozhraní založená na technice "pull"

Rozhraní založená na technice "pull"

  • Aplikace "nečeká na události", ale "vytahuje si" příslušná data ze vstupního parsovaného souboru.

  • Využíváme tam, kde "víme, co ve zdroji očekávat" a "postupně si to bereme"

  • ... vlastně opak API řízeného událostmi.

  • Z hlediska aplikačního programátora velmi pohodlné, ale implementace bývají o něco pomalejší než klasická "push" událostmi řízená rozhraní.

  • Pro Javu existuje XML-PULL parser API - viz Common API for XML Pull Parsing a také

  • nově vyvíjené rozhraní Streaming API for XML (StAX) vznikající "shora i zdola" jako produkt JCP (Java Community Process).

Streaming API for XML (StAX)

Toto API se později může stát standardní součástí javového prostředí pro práci s XML, tzv. JAXP.

Nabízí dva přístupy k "pull" zpracování:

  • přístup k "vytahovaným" událostem prostřednictvím iterátoru - pohodlnější

  • nízkoúrovňový přístup přes tzv. kurzor - rychlejší

StAX - příklad s iterátorem

Příklad 1.10. StAX - přístup iterátorem

import java.io.*;
import java.util.Iterator;
import javax.xml.namespace.QName;
import javax.xml.stream.*;
import javax.xml.stream.events.*;
public class ParseByEvent {
   public static void main(String[] args) 
                        throws FileNotFoundException, XMLStreamException {
      // Use the reference implementation for the XML input factory
      System.setProperty("javax.xml.stream.XMLInputFactory", 
                                  "com.bea.xml.stream.MXParserFactory");
      // Create the XML input factory
      XMLInputFactory factory = XMLInputFactory.newInstance();
      // Create the XML event reader
      FileReader reader = new FileReader("somefile.xml");
      XMLEventReader r = 
         factory.createXMLEventReader(reader);
      // Loop over XML input stream and process events
      while(r.hasNext()) {
         XMLEvent e = r.next();
         processEvent(e);
      }
   }
/**
 * Process a single XML event
 * @param e - the event to be processed
 */
  private static void processEvent(XMLEvent e) {
     if (e.isStartElement()) {
        QName qname = ((StartElement) e).getName();
        String namespaceURI = qname.getNamespaceURI();
        String localName = qname.getLocalPart();
        Iterator iter = ((StartElement) e).getAttributes();
        while (iter.hasNext()) {
           Attribute attr = (Attribute) iter.next();
           QName attributeName = attr.getName();
           String attributeValue = attr.getValue();
        }
     }
     if (e.isEndElement()) {
        QName qname = ((EndElement) e).getName();
     }
     if (e.isCharacters()) {
        String text = ((Characters) e).getData();
     }
     if (e.isStartDocument()) {
        String version = ((StartDocument) e).getVersion();
        String encoding = ((StartDocument) e).getCharacterEncodingScheme();
        boolean isStandAlone = ((StartDocument) e).isStandalone();
     }
  }
}
[Poznámka]Poznámka

příklad převzat z Tip: Use XML streaming parsers (IBM DeveloperWorks, sekce XML).

StAX - příklad s kurzorem

Příklad 1.11. StAX - přístup kurzorem

import java.io.*;
import javax.xml.stream.*;
public class ParseByIterator {
   public static void main(String[] args) 
                        throws FileNotFoundException, XMLStreamException {
      // Use reference implementation
      System.setProperty(
         "javax.xml.stream.XMLInputFactory",
         "com.bea.xml.stream.MXParserFactory");
      // Create an input factory
      XMLInputFactory xmlif = XMLInputFactory.newInstance();
      // Create an XML stream reader
      XMLStreamReader xmlr =
         xmlif.createXMLStreamReader(new FileReader("somefile.xml"));
      // Loop over XML input stream and process events
      while (xmlr.hasNext()) {
         processEvent(xmlr);
         xmlr.next();
      }
   }
   /**
    * Process a single event
    * @param xmlr - the XML stream reader
    */
   private static void processEvent(XMLStreamReader xmlr) {
      switch (xmlr.getEventType()) {
         case XMLStreamConstants.START_ELEMENT :
            processName(xmlr);
            processAttributes(xmlr);
            break;
         case XMLStreamConstants.END_ELEMENT :
            processName(xmlr);
            break;
         case XMLStreamConstants.SPACE :
         case XMLStreamConstants.CHARACTERS :
            int start = xmlr.getTextStart();
            int length = xmlr.getTextLength();
            String text =
               new String(xmlr.getTextCharacters(), start, length);
            break;
         case XMLStreamConstants.COMMENT :
         case XMLStreamConstants.PROCESSING_INSTRUCTION :
            if (xmlr.hasText()) {
               String piOrComment = xmlr.getText();
            }
            break;
      }
   }
   private static void processName(XMLStreamReader xmlr) {
      if (xmlr.hasName()) {
         String prefix = xmlr.getPrefix();
         String uri = xmlr.getNamespaceURI();
         String localName = xmlr.getLocalName();
      }
   }
   private static void processAttributes(XMLStreamReader xmlr) {
      for (int i = 0; i < xmlr.getAttributeCount(); i++)
         processAttribute(xmlr, i);
   }
   private static void processAttribute(XMLStreamReader xmlr, int index) {
      String prefix = xmlr.getAttributePrefix(index);
      String namespace = xmlr.getAttributeNamespace(index);
      String localName = xmlr.getAttributeName(index);
      String value = xmlr.getAttributeValue(index);
   }
}
[Poznámka]Poznámka

příklad převzat z Tip: Use XML streaming parsers (IBM DeveloperWorks, sekce XML).

Document Object Model (DOM)

Základní rozhraní pro tvorbu a přístup ke stromové reprezentaci XML dat.

  • existují verze DOM Level 1, 2, 3

  • DOM je obecně nezávislý na způsobu analýzy (parsingu) vstupního XML

  • Je popsán IDL definicemi+popisy rozhraní v jednotlivých jazycích (zejm. C++ a Java)

Specifický DOM pro HTML dokumenty

  • Core (základ) DOM pro HTML je nyní "víceméně" sloučen s DOM pro XML

  • určen pro styly CSS

  • určen pro programování dynamického HTML (skriptování - VB Script, JavaScript)

  • kromě samotného dokumentu model zahrnuje i prostředí prohlížeče (např. windowsearch with www.instantweb.com, historysearch with www.instantweb.com...)

Odkazy k DOM

Implementace DOM

Alternativní stromové modely - XOM

  • XOM (XML Object Model) vznikl jako one-man-show projekt (autor Elliote Rusty Harold) rozhraní, které je "papežštější než papež" a striktně respektuje model XML dat.

  • Motivaci a specifikaci najdete na domovské stránce XOM.

  • Tam je též k získání open-source implementace XOM a

  • dokumentace API.

Alternativní parsery a stromové modely - NanoXML

  • velmi malé (co do velikosti kódu) stromové rozhraní a parser v jednom

  • dostupné jako open-source na http://nanoxml.n3.net

  • adaptované též pro mobilní zařízení

  • z hlediska rychlosti a paměťové efektivity za běhu ale nejlepší není

Prakticky dobře použitelný stromový model: dom4j

Kombinace stromových a událostmi řízených přístupů

Události -> strom

  • Je např. možné "nezajímavou" část dokumentu přeskočit nebo odfiltrovat pomocí sledování událostí a pak

  • za "zajímavé" části vytvořit strom v paměti a ten zpracovávat.

Strom -> události

  • Vytvoříme strom dokumentu (a zpracujeme ho) a

  • strom následně procházíme a generujeme události jako bychom četli výchozí soubor.

  • Toto umožňuje snadnou integraci obou typů zpracování v jedné aplikaci

Virtuální objektové modely

Cíle a charakteristiky jazyků schémat

Cíle modelování XML dat

Cílem je poskytnout abstraktní model dat v příslušném značkování tak, abychom:

  • mohli validovat, zda dokumenty jsou syntakticky korektní, zda odpovídají schématu

  • následně mohli dokumenty (data) zpracovávat jako silně typované:

    • hodnoty textových uzlů pak interpretovány jako hodnoty primitivních datových typů (int, float, boolean...), nebo vestavěných neprimitivních typů - řetězec, datum

    • elementy interpretovány jako hodnoty uživatelských objektových typů, např. element person jako objekt třídy Person.

  • používat informace o struktuře validních dokumentů např. při vyhledávání:

    • víme-li např., že element from se vyskytuje jen jako dceřinný v elementu message, můžeme a priori rozhodnout, že výsledek XPath dotazu /address/from bude nad validními dokumenty vždy prázdný

    • totéž např. pro dokumenty, kde známe pořadí výskytu dceřinných elementů za sebou - pak můžeme např. predikovat obsah XPath osy following-sibling.

  • používat je při vizualizaci, formátování, editaci(!)

Přístupy k modelování XML dat

XML 1.0, 1.0 SE, 2.0 standardy definují metajazyky, tj.:

  • neříkají ni o konkrétním značkování

  • ale sděluje, jaká obecná omezení pro konstrukci značkování platí (např. správné vnoření elementů)

  • definuje DTD jako základní formální jazyk definice struktury dokumentu

  • ale nevylučuje existenci dalších takových jazyků

Popis příslušného značkování, tj. návod, které dokumenty v daném značkování chápeme jako platné (validní), nazýváme schématem příslušného značkovacího jazyka.

(Meta)jazyk, v němž je schéma zapsáno, nazveme jazykem schémat.

Neplést schéma a jazyk schématu v tomto širokém smyslu s XML Schema (což je speciální případ jazyka schémat, případně jeho instance).

Kategorie jazyků schemat

Podle základního výrazového prostředku, kterým definujeme „správnou“ strukturu dokumentů, rozlišujeme jazyky schémat založené na:

  • gramatikách

  • objektovém přístupu, skládání, dědičnosti

  • vzorech

Modelování pomocí gramatik

Typická situace:

  • značkování je bezkontextovým jazykem definovaným gramatikou

  • typickým představitelem je gramatika zapsaná v DTD (s jistým non-CF omezeními, jako je např. vazba ID-IDREF)

  • jazyky XML Schema i Relax NG převzaly částečně tento přístup - kombinují gramatiku s možností dědičnosti

Typickým představitelem je XML DTD.

Modelování pomocí dědičnosti

Hlavní charakteristiky:

  • jednou vytvořené schéma či jeho část je možné pojmenovat a znovu použít

    • beze změny

    • při znovupoužití je možné pozměnit jeho vlastnosti (např. zpřísnit některá omezení), obvykle ale tak, že je zachováno pravidlo, že instance podtřídy může vždy nahradit instanci nadtřídy (má aspoň její vlastnosti)

Typickými představiteli jsou XML Schema a Relax NG (čteme jako „relaxing“).

Modelování pomocí vzorů

Schéma tohoto typu říká, jaké vzory se mohou/musejí/nesmějí v dokumentu nacházet.

  • nejméně používaná schémata, ale v mnohých situacích nenahraditelná

  • vhodná pro XML data dokumentové (tj. velmi heterogenní, mnohotvaré) povahy - značkované texty

  • Používáme tam, kde je prostředky (CF) gramatiky určité omezení (constraint) těžko popsatelný - např. složité kontextové závislosti. To by se jinak muselo např. „dovalidovat“ externím nástrojem.

  • prostředkem popisu vzorů je určitý „vnořený“ jazyk - např. stromové regulární výrazy, výrazy jazyka XPath...

Typickým představitelem je Schematron a Examplotron.

Funkcionální modelování

Funkcionální modelování

XML Schema

XML Schema - základní zdroje informací

Specifikace XML Schema - http://www.w3.org/XML/Schema

Tutoriál Using W3C XML Schema: http://www.xml.com/pub/a/2000/11/29/schemas/part1.html - stručný

XML Schema Tutorial - http://www.w3schools.com/schema/default.asp - obsáhlejší

vynikající komplexní tutoriál na http://www.xfront.com

XML Schema - motivace

Dát silnější prostředek pro specifikaci modelu XML dat než je DTD; mít možnost:

  • Oddělit koncept typu (např. typu elementu) od jeho výskytu (instance, např. elementu s určitým názvem) - to DTD neumí

  • Poskytnout bohatší škálu primitivních datových typů

  • Umožnit použití jmenných prostorů

  • Umožnit jemnější specifikaci modelu obsahu (elementů)

  • Umožnit odvozování nových typů (dědičností)

  • Umožnit modularizaci a znovupoužitelnost schémat

  • Zapisovat schéma v XML

XML Schema - hlavička definice schématu

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
   .../...
</xs:schema> 

XML Schema - přiřazení typu elementu s daným názvem

<xs:element name="element_name">
   ... definice typu - je přímo zde - tzv. "local" nebo daná odkazem - tzv. "global"
</xs:element>

XML Schema - definice jednoduchého typu

  • Neobsahuje dceřinné elementy, lze použít jako typ obsahu elementu nebo atributu

  • Lze definovat restrikcí z existujícího typu

<xs:simpleType name="TypeName">
   <xs:restriction base="BaseTypeName"> ... </xs:restriction>
</xs:simpleType> 

XML Schema - definice jednoduchého typu - příklad 1

Restrikce délky obsahu

<xs:simpleType name="nameType">
   <xs:restriction base="xs:string">
      <xs:maxLength value="32"/>
   </xs:restriction>
</xs:simpleType> 

XML Schema - definice jednoduchého typu - příklad 2

Restrikce obsahu regulárním výrazem

<xs:simpleType name="isbnType">
   <xs:restriction base="xs:string">
      <xs:pattern value="[0-9]{10}"/>
   </xs:restriction>
</xs:simpleType> 

XML Schema - jednoduché typy - "union"

Zhruba odpovídá konceptu "union" v C

Výsledkem je jednoduchý typ

Lze spojovat bázový typ a výčet hodnot

Příklad:

<xs:simpleType name="isbnType">
   <xs:union>
      <xs:simpleType>
         <xs:restriction base="xs:string">
            <xs:pattern value="[0-9]{10}"/>
         </xs:restriction>
      </xs:simpleType>
      <xs:simpleType>
         <xs:restriction base="xs:NMTOKEN">
            <xs:enumeration value="TBD"/>
            <xs:enumeration value="NA"/>
         </xs:restriction>
      </xs:simpleType>
   </xs:union>
</xs:simpleType> 

XML Schema - jednoduché typy - seznam hodnot

Lze definovat typ jako seznam hodnot oddělených bílými znaky

Dalším odvozením lze omezit počet prvků seznamu

Příklad

<xs:simpleType name="isbnTypes">
   <xs:list itemType="isbnType"/>
</xs:simpleType>
<xs:simpleType name="isbnTypes10">
   <xs:restriction base="isbnTypes">
      <xs:minLength value="1"/>
      <xs:maxLength value="10"/>
   </xs:restriction>
</xs:simpleType> 

XML Schema - definice složeného typu

<xs:complexType name="TypeName">
   <xs:sequence>
      <xs:element ...>
      ... 
      <xs:attribute ...> 
   </xs:sequence>
</xs:complexType>

Místo sekvence lze použít <xs:choice> a <xs:all>

XML Schema - definice složeného typu - skupiny

při definici složeného typu lze použít skupiny (group)

Skupina elementů:

<xs:group name="GroupName">
   <xs:sequence>
      <xs:element ... /> 
      ... 
   </xs:sequence>
</xs:group> 

Místo sekvence lze použít <xs:choice> a <xs:all>

XML Schema - definice složeného typu - skupiny atributů

Skupina atributů:

<xs:attributeGroup name="AttributesGroupName">
   <xs:attribute ... use="required"/> 
   ...
</xs:attributeGroup>

Může být uvedena povinnost výskytu (use=required)

XML Schema - použití skupin

Příklad použití skupin elementů a atributů

<xs:complexType name="bookType">
   <xs:sequence>
      <xs:group ref="mainBookElements"/>
      <xs:element name="character" type="characterType" 
                  minOccurs="0" maxOccurs="unbounded"/>
   </xs:sequence>
   <xs:attributeGroup ref="bookAttributes"/>
</xs:complexType> 

XML Schema - kompozitor "sequence"

Předepisuje výskyt dceřinných elementů v určitém pořadí

<xs:element name="element_name">
   <xs:complexType>
      <xs:sequence>
         .../... 
      </xs:sequence>
      .../...
   </xs:complexType>
</xs:element> 

sequence označuje model obsahu připouštějící výskyt dané posloupnosti (sekvence) dceřinných elementů

xs je prefix vázaný na NS s URL http://www.w3.org/2001/XMLSchema

Místo <xs:sequence> lze použít <xs:choice> nebo <xs:all>

XML Schema - kompozitor "choice"

Předepisuje výskyt jednoho z dceřinných elementů nebo skupin elementů

<xs:element name="element_name">
   <xs:complexType>
      <xs:choice>
        .../...
      </xs:choice>
      .../...
   </xs:complexType>
</xs:element> 

XML Schema - kompozitor "all"

Předepisuje výskyt dceřinných elementů bez určeného pořadí

Smí být jen na nejvyšší úrovni definice obsahu

Dceřinné elementy nesmí mít kardinalitu větší než 1

Příklad:

<xs:complexType name="bookType">
   <xs:all>
      <xs:element name="title" type="xs:string"/>
      <xs:element name="author" type="xs:string"/> 
      <xs:element name="character" type="characterType" 
                  minOccurs="0" maxOccurs="unbounded"/>
   </xs:all>
   <xs:attribute name="isbn" type="isbnType" use="required"/>
</xs:complexType> 

XML Schema - jednoduchý obsah elementu

Příklad:

<xs:element name="book">
   <xs:complexType>
      <xs:simpleContent>
         <xs:extension base="xs:string">
            <xs:attribute name="isbn" type="isbnType"/>
         </xs:extension>
      </xs:simpleContent>
   </xs:complexType>
</xs:element>  

XML Schema - smíšený obsah elementu

Nelze validovat textový obsah (textové dceřinné uzly)

Lze validovat dceřinné elementy

Příklad:

<xs:element name="book">
   <xs:complexType mixed="true">
      <xs:all>
         <xs:element name="title" type="xs:string"/>
         <xs:element name="author" type="xs:string"/>
      </xs:all>
      <xs:attribute name="isbn" type="xs:string"/>
   </xs:complexType>
</xs:element> 

XML Schema - další možnosti

Možnost specifikace integritních omezení:hodnota je jedinečná - xs:uniquehodnota je klíčem - xs:keyhodnota je odkazem na klíč - xs:keyref

XML Schema - anotace schémat

Anotace je (lidsky čitelná) poznámka-komentář ke schématu

Může též obsahovat informace pro zpracování - viz příklad - xs:appinfo

Další obsah není předepsán (omezen) - viz příklad - bind, class

Příklad

<xs:annotation> 
   <xs:documentation xml:lang="en">Top level element.</xs:documentation>
   <xs:documentation xml:lang="fr">Element racine.</xs:documentation>
   <xs:appinfo source="http://example.com/foo/">
      <bind xmlns="http://example.com/bar/">
         <class name="Book"/>
      </bind>
   </xs:appinfo>
</xs:annotation> 

XML Schema - znovupoužití definice schématu

Přímo:

<xs:include schemaLocation="character.xsd"/>

S předefinováním:

<xs:redefine schemaLocation="character12.xsd">
   <xs:simpleType name="nameType">
      <xs:restriction base="xs:string">
         <xs:maxLength value="40"/>
      </xs:restriction>
   </xs:simpleType>
</xs:redefine> 

XML Schema - abstraktní a konečné typy

abstract - nelze instanciovat, pouze jako zákad k odvozování dědičností

final - nelze rozšiřovat/odvozovat dědičností

XML Schema - jmenné prostory

Příklad

<xs:schema targetNamespace="http://example.org/ns/books/"
           xmlns:xs="http://www.w3.org/2001/XMLSchema"
           xmlns:bk="http://example.org/ns/books/"
           elementFormDefault="qualified"
           attributeFormDefault="unqualified">
   .../... 
</xs:schema> 

XML Schema - nespecifikované elementy a atributy

Umožní připustit i něco, co předem neznáme

Příklad

<xs:complexType name="descType" mixed="true">
   <xs:sequence> 
      <xs:any namespace="http://www.w3.org/1999/xhtml"
              processContents="skip" 
              minOccurs="0" maxOccurs="unbounded"/> 
   </xs:sequence>
</xs:complexType> 

Pro atributy - xs:anyAttribute

XML Schema - odkaz na definici schématu

<book isbn="0836217462" 
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xsi:noNamespaceSchemaLocation="file:library.xsd"> 
<book isbn="0836217462"
      xmlns="http://example.org/ns/books/"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xsi:schemaLocation="file:library.xsd">

Relax NG

Relax NG - motivace

XML Schema:

  • Je (zbytečně) složité (specifikace má přes 200 stran)

  • Může vést v jistých situacích k nejednoznačnostem.

  • Snaží se o pokrytí všech aplikačních oblastí (dokumentové i databázové použití XML a všechno mezi tím).

  • Obtížně (úplně) implementovatelné.

  • Dále viz http://www.xml.com/lpt/a/2002/01/23/relaxng.html

Relax NG - základní zdroje informací

Vznikl z RELAXu při skupině OASIS-OPEN:

Jazyky schémat používající vzory

Ostatní jazyky schémat

DSD 2.0

Vznikl na Univerzitě v Aarhusu, DK

Podobně jako RELAX NG je jednodušší než XML Schema

viz http://www.brics.dk/~amoeller/XML/

Spíše akademický charakter, skutečnými soupeři zůstávají XML Schema a RELAX NG

Vyjadřovací síla těchto modelů, jejich nedostatky

viz http://www.xml.com/lpt/a/2001/12/12/schemacompare.html

Nástroje na validaci XML dat modelovaných podle těchto standardů

Nástroje na validaci XML dat modelovaných podle těchto standardů

XPath - aplikační oblasti

  • Pokročilá navigace v XML datech

  • Transformace (XSLT)

  • V "selekční části" XML dotazovacích jazyků

  • V některých modelovacích jazycích - Schematron

XPath - hlavní principy

  • XPath je syntaxe pro specifikaci částí XML dokumentů (uzly, množiny uzlů, sekvence uzlů; nelze specifikovat části textových uzlů).

  • XPath používá syntaxi obdobnou jako cesty v souborovém systému.

  • XPath používá knihovnu standardních funkcí (evt. uživatelsky definovaných - v XPath 2.0 nebo i XPath 1.x, ale proprietárně - podle procesorů)

  • XPath je od v 1.0 základem pro XSLT, od 2.0 i pro XQuery

  • XPath syntaxe není XML (bylo by příliš "upovídané")

  • XPath 1.0 je W3C Recommendation - http://www.w3.org/TR/xpath

XPath - pojem cesty (paths) a lokace (locations)

Cesta určuje lokaci v dokumentu

Cesty jsou konstruovány podobně jako cesty ve FS, tj.

  • relativní - vyhodnocovány vůči kontextovému uzlu (KU), viz dále

  • absolutní - od kořene, ale výrazy (predikáty) také vyhodnocovány vůči KU

Syntaktická pravidla:

[20] PathExpr   ::=  AbsolutePathExpr |  RelativePathExpr
[22] AbsolutePathExpr   ::=  ("/"  RelativePathExpr?)  |  ("//"  RelativePathExpr)
[23] RelativePathExpr   ::=  StepExpr (("/"  |  "//")  StepExpr)*
[24] StepExpr   ::=  AxisStep |  GeneralStep
[25] AxisStep   ::=  (Axis?  NodeTest StepQualifiers)  |  AbbreviatedStep

XPath - osy (axes)

Osy jsou množiny prvků dokumentu, vymezené (obvykle relativně) vůči kontextu.

Kontext je tvořen především dokumentem a aktuálním (kontextovým) uzlem.

Osami jsou:

  • child - obsahuje dceřinné uzly kontextového (aktuálního) uzlu

  • descendant - obsahuje všechny potomky kontextového (aktuálního) uzlu (dále jen KU). Nepočítají se mezi ně atributy!!!

  • parent - obsahuje rodičovský uzel KU (existuje-li)

  • ancestor - obsahuje všechny předky - rodiče, "prarodiče"... kořenový element (pokud KU není sám kořenový)

  • following-sibling - obsahuje všechny následující sourozence KU (pro NS a atributy je tato osa prázdná)

  • preceding-sibling - dtto, ale obsahuje předchozí sourozence

  • following - obsahuje všechny uzly nacházející se po KU (mimo atributů, potomků a NS uzlů

  • preceding - dtto, ale obsahuje předchozí uzly (ale mimo předky, attributy, NS!)

  • attribute - obsahuje atributy (jen pro uzly - elementy)

  • namespace - obsahuje všechny NS uzly KU (jen pro uzly - elementy)

  • self - obsahuje samotný KU

  • descendant-or-self - obsahuje sjednocení os descendant a self

  • ancestor-or-self - obsahuje sjednocení os ancestor a self

XPath - predikáty (predicates)

Určeny k selekci (výběru) z uzlů specifikovaných např. cestou

př.: /article/para[3] - vybere třetí odstavec v článku

Nejjednodušším výrazem v predikátu je specifikace pozice (blízkosti) (proximity position) - viz výše

  • pozor u reverzních os (ancestor, preceding...) - pozice se počítá v rámci množiny uzlů vždy OD KONTEXTOVÉHO UZLU!

  • specifikaci pozice 3 možno nahradit výrazem position()=3

XPath - Výrazy

Určeny k použití v predikátech, k výpočtům, atd.

Výrazy mohou být:

  • řetězcové

  • numerické (hodnotami jsou floating-point čísla)

  • logické (boolean)

  • uzly

  • sekvence

XPath - zkrácená notace - Příklady

  • para selects the para element children of the context node

    vybere všechny dceřinné elementy kontextového uzlu jmenující se para

  • * selects all element children of the context node

  • text() selects all text node children of the context node

  • @name selects the name attribute of the context node

  • @* selects all the attributes of the context node

  • para[1] selects the first para child of the context node

  • para[last()] selects the last para child of the context node

  • */para selects all para grandchildren of the context node

  • /doc/chapter[5]/section[2] selects the second section of the fifth chapter of the doc

  • chapter//para selects the para element descendants of the chapter element children of the context node

    vybere všechny element para, jež jsou následníky chapter

  • //para selects all the para descendants of the document root and thus selects all para elements in the same document as the context node

    vybere všechny elementy para z dokumentu

  • //olist/item selects all the item elements in the same document as the context node that have an

    vybere všechny elementy item, které mají za rodiče olist

  • . selects the context node

    vybere kontextový uzel

  • .//para selects the para element descendants of the context node

    vybere všechny elementy-potomky kontextového uzlu, které nesou značku para

  • .. selects the parent of the context node

    vybere rodičovský uzel od kontextového

  • ../@lang selects the lang attribute of the parent of the context node

    vybere atribut lang rodičovského uzlu od kontextového

XPath - zkrácená notace (2)

Nejpoužívanější zkracování je osy child :

  • tj. píšeme article/para místo child::article/child::para.

  • a atributu: píšeme para[@type="warning"] místo child::para[attribute::type="warning"]

  • Další používané zkracování je // místo /descendant-or-self::node()/

  • a samozřejmě zkratky . a ..

  • Pro přehlednost někdy delší formu zachováváme

Informační zdroje k XPath

XPath 2.0

  • zatím jako PRACOVNÍ NÁVRH - http://www.w3.org/TR/xpath20/

  • Změna pohledu na hodnoty vrácené XPath výrazem: vše jsou sekvence (byť jednoprvkové)

  • ->odstraňuje problémy s "pořadím" uzlů v množině

  • Zavádí podmíněné výrazy a cykly

  • Zavádí možnost uživatelských funkcí (psaných jako dynamicky vyhodnocované výrazy v XPath)

  • Lze použít existenční a obecné kvantifikátory, např. exist student/name="Fred" nebo all student/@id

  • Dále viz např. http://saxon.sourceforge.net/saxon7.8/index.html

XPath 2.0 - příklady

XML Linking Language (XLink)

XLink - úvod

XLink pracuje na úrovni XML Infoset

Dovoluje odkazovat se:

  • v rámci dokumentu,

  • z jednoho dokumentu na další,

  • mezi dokumenty (odkaz je uložen mimo ně)

Rozlišuje kategorie:

  • adresa (též zdroj nebo lokace, tj. odkazovaný objekt - element, skupina elementů, text...)

  • a vlastní odkaz

  • Odkaz pak představuje vazbu mezi zdroji s případným upřesněním sémantiky odkazu.

XML Linking Language (XLink) - původ standardu

  • W3C Recommendation 27 July 2001

  • Obecný mechanizmus na propojování XML zdrojů (=dokumentů a jejich částí)

  • Inspirován zejména std. HyTime (http://www.hytime.org/)

  • Ortogonální k entitám (lze použít současně oboje)

  • mnohem bohatší sémantika než u entit,

  • entity se vyhodnocují (resolve) při parsingu,

  • XLink odkazy většinou až v aplikaci

XLink - historie a motivace

Výhody odkazové infrastruktury na bázi XLink

  • Na rozdíl od SGML linků (např. v HyTime) můžeme v XML využívat jmenné prostory. Nenutí nás to upravovat DTD při použití odkazů.

  • Infrastruktura odkazů může existovat (v jiném NS) nezávisle na schématu (struktuře) XML dokumentů, v nichž se odkazy vyskytují.

  • Odkazy mohou být fyzicky mimo soubory s odkazovanými lokacemi.

XLink - základní principy

Integrace XLinku do (schémat) dokumentů

  • Atributy a elementy XLinksearch with www.instantweb.comu mají vlastní jmenný prostor

  • Jako prefix NS se obvykle používá xlinksearch with www.instantweb.com

  • Příslušnost k XLinku je dána deklarací daného elementu/atributu v XLink NS

  • to umožňuje flexibilní integraci stávajících schémat (modelů) a XLinku (nemusíme měnit jména "linkovacích" elementů)

  • XLink odkaz "dovnitř" dokumentů používají standard XPointersearch with www.instantweb.com (http://www.w3.org/TR/xptr).

XLink - základní typy

  • Jednoduchý (simplesearch with www.instantweb.com) - vždy "in-line"

  • Rozšířený (extendedsearch with www.instantweb.com) - může být "out-of-line" (i v jiném dokumentu/souboru/databázi odkazů)

Simple XLink odkaz

  • Váže jeden lokální zdroj na jeden vzdálený (single local -> single remote entity);

  • Je vyznačen atributem xlink:type="simple"search with www.instantweb.com;

Extended XLink odkaz

<