XML & spol.
###########
Úvod do XML
===========
Historie
--------
- speciální řídící sekvence pro osvitové jednotky (60. léta) -> obecné
příkazy + konvertory -> TeX (70. léta) - zaměřeno na tisk dokumentu
- pro elektronické zpracování dokumentů potřeba logické struktury,
význam označených částí dokumentu, forma (vzhled) podřadná ->
značkovací jazyk GML (Generalized Markup Language, 80. léta) -> ANSI
norma SGML (Standard GML)
- metajazyk = jazyk pro vytváření jazyků
- SGML příliš obecné a složité -> pro webové stránky (90. léta)
jednoduchý jazyk HTML (HyperText Markup Language) - kromě obsahu
(znovu) forma -> pevně dané značky spíše pro vzhled dokumentu
(stránky), absence struktury dokumentu (pro strojové zpracování a
vyhledávání), nekompatibilita a problémy zobrazování prohlížeči, ...
- oddělit obsah a formu (styl), strukturovat, standardně -> XML
(eXtensible Markup Language) - používaná podmnožina SGML (parametry
pevně zvolené, přísná jednoduchá syntaxe)
- necelých 10 let historie XML (počátky 1997, první specifikace 1998)
eXtensible Markup Language
--------------------------
- rozšiřitelný = pevná syntaxe značek pro strukturování dokumentu, ale
bez významu značek (sémantiky, narozdíl od HTML), rozšíření o význam
značek (jazyky založené na XML)
- značkovací = vyznačení struktury dokumentu pomocí značek
- jazyk = metajazyk pro vytváření jazyků?
- standardní (W3C, World Wide Web Consortium) human readable
rozšiřitelný jazyk (formát) pro tvorbu vlastních jazyků (formátů) s
jednoduchou syntaxí a snadnou implementací (ve srovnání se SGML)
- standardní jazyky založené na XML: XHTML, XSL, XML Schema, XPath,
XQuery (rodina XML), SVG, MathML, SOAP, ... (W3C), DocBook, WML,
RSS/Atom, XML-RPC, *Office, XUL, Jabber (jiní)
Proč právě XML?
---------------
- otevřený (nepropriétární), licencemi nezatížený, platformě nezávislý
formát pro uchování a zpracování dokumentů a komunikaci
- stabilní - vydrží (vydržel) déle než binární proprietární formáty
konkrétních aplikací a firem
- flexibilní reprezentace čehokoliv (dat. formáty, volání procedur,
...), použitelný ve většině průmyslových odvětví (zejména IT)
- mezinárodní (internacionalizace) - od začátku, Unicode (metoda UTF-8
normy ISO 10646) + info o použité znakové sadě -> bezproblémově
jakékoliv znaky
- jednoznačně rozhodnutelná jednoduchá syntaxe (well-formedness),
snadná konverze do jiných (i binárních) formátů
- možnost přidat sémantickou informaci a vytvořit tak vlastní formát
s vlastnostmi XML, automatická kontrola struktury formátu (validace)
- aktivní komunita koordinovaná W3C, open source implementace standardů
-> standardní univerzální datový formát
Proč ne XML?
------------
- zbytečně upovídané - ano, ale srozumitelné (textové), velikost řeší
komprimace
- dvojí notace: elementy a atributy - co má být element a co atribut?
-> atributy popisují elementy jako základní stavební kameny, věc citu
- složité standardy velké rodiny XML - ano, ale není nutné používat
všechny, jazyky založené na XML = aplikace XML, nepochopení: ne XSL,
XQuery, XPath, ..., ale otevřenost, flexibilita, internacionalizce,
... viz výše
- obtížné pro programátory - zpracování časově náročné a náchylné na
chyby (hierarchický přístup, oproti tabulkovým řádkům s oddělovači)
- neexistující jednotné API - celé do paměti (DOM) nebo nemotorné
callback funkce (SAX), ano -> reg. výrazy?, XSLT, DOM+XPath ->
proudové zpracování po nalezení elementu (chybí obecné pull rozhraní
a navigační jazyk)
Svět technologií XML
--------------------
- výměna informací v B2B, B2C, jazyky založené na XML
- elektronické publikování (po přidání stylu)
- univerzální datový formát (pro data i parametry programů)
- sémantický web a kontextové vyhledávání - budoucnost?
- ,,XML je dnes prostě všude''
- role W3C - koordinátor, standardizátor
Syntaxe XML
===========
- specifikace XML 1.0 (čtvrtá revize,
http://www.w3.org/TR/2006/REC-xml-20060816/)
- pro znalce HTML: podobné HTML, ale přísnější
- značky (tagy) vymezují elementy, obsah elementu začíná startovacím
tagem a povinně končí koncovým tagem nebo prázdný tag
obsah
- vnořování elementů
obsahtext
- nekřížení elementů (startovací a koncový tag ve stejném elementu)
NE: text
- jediný nejvyšší kořenový element
- element může mít atributy s hodnotami ve startovacím tagu, hodnoty
uvedené v uvozovkách nebo apostrofech (možné vnořit)
- jména elementů a atributů podle specifikace: musí začínat písmenem,
pak mohou být čísla, tečky, dvojtečky, pomlčky a podtržítka, i
diakritika (obecně Unicode znak)
- znakové entity pro speciální znaky (<, >, atd.)
<, >, &, ", '
- numerické entity pro všechny znaky
&, &
- case-sensitive, všechny znaky z použité znakové sady (výchozí
Unicode)
-> syntakticky správný dokument = well-formed dokument
Dále:
-----
- hlavička (deklarace) s použitou znakovou sadou
- komentáře - kdekoliv mezi elementy, nelze zakomentovat atributy
elementu
NE: />
- sekce CDATA pro větší kusy textu se speciálními znaky (např. kód
programovacího jazyka)
- instrukce pro zpracování (processing instructions) - připojení
stylu, příkazy pro preprocesory, skriptovací jazyky, značky editorů,
apod.
Jmenné prostory (Name spaces)
-----------------------------
- doplněk specifikace XML (http://www.w3.org/TR/REC-xml-names/)
- identifikován pomocí URI, specifikován pomocí deklarovaného prefixu
- kvalifikovaná jména elementů a atributů pomocí prefixu a lokálního
jména -> elementy a atributy v kontextu prostoru
- elementy dědí (výchozí) prostor rodičovského elementu - prostor
zadáván nejčastěji u kořenového elementu, atributy dědí prostor
elementu, ne výchozí
- oddíly prostoru pro elementy, globální a lokální atributy (pro
element) -> problémy
Editory
=======
- jakýkoliv textový editor
- podpora pro zvýraznění syntaxe, automatické doplnění koncového tagu,
kontrolu syntaxe (well-formedness), kontrolu validity a zobrazení
přípustných tagů, atributů a hodnot (pokud je dostupné schéma, viz
Schémata dále)
- žádný, částečný nebo úplný WYSIWYG (skrytí syntaxe jazyka)
- př. JEdit, XMLMind, Bluefish, Quanta, GNU/Emacs, Vim, EmEditor,
UltraEdit, TextPad, EpicEditor, XMetaL, VS.NET, M$ XML Notepad, Etna
XML Editor, , aj.
Parsery
=======
- programy pro čtení, zpracování a kontrolu XML dokumentu
(well-formedness i validace)
- většinou příkazová řádka
- př. SP (pro SGML, program nsgmls), Expat, Jing, CookXML, TinyXML,
aj.
- pro programátory: čtení a zápis textových souborů -> standardizovaná
rozhraní (API) pro práci s dokumentem implementovaná v knihovnách
(parserech)
- př. Xerces (Java, C++), JAXP (Java), libxml2 (C, C++), M$ XML parser
(C++ COM objekt), .NET System.Xml XmlReader (.NET jazyky), S-XML,
XMLisp (Common Lisp)
Prohlížeče
==========
- webovské prohlížeče
- podpora zobrazení pomocí stylu (zobrazovacího nebo transformačního),
viz Styly dále
API
===
- standardizovaná rozhraní (API) pro programové čtení, zpracování a
kontrolu (well-formedness i validace) XML dokumentů
- implementovaná v knihovnách pro většinu prog jazyků (C/C++, Java,
.NET/C#, Lisp, Perl, Python, ...) = parser
- nabízí abstraktní model dokumentu (infoset) - elementy, atributy,
textpvý obsah, atd.
- dříve v zásadě dva hlavní, DOM a SAX, dnes více různých přístupů
(rozšíření DOMu, pull SAX), částečně neslučitelné (např. DOM a
XPath), očekává se DOM3 (integruje XPath)
- nevalidující (infoset s textovými hodnotami) a validující mód
(infoset oproti schématu s datovými typy)
- kromě čtení a zápisu obecná transformace dokumentu (např. do HTML) -
XSLT parser
SAX (Simple API for XML)
-----------------------
- přístup k dokumentu na základě řízení událostí (event-driven
přístup) vyvolaných při sekvenčním průchodu dokumentem
- rozhraní pro definici callback funkcí (nebo metod objektu handleru)
jako reakcí na události vyvolané parserem (začátek, obsah, konec
elementu, komentář, atd.)
- funkci předány parametry popisující událost (např. jméno elementu)
- výhody: rychlost, malá spotřeba paměti
- nevýhody: zpracování na jeden průchod, vlastní stavové proměnné v
programu, pouze čtení dokumentu!
- většinou push přístup (,,tlačí'' události), ale i pull přístup
(program ,,si říká'' o části dokumentu)
- de facto standard, vzniklo rychle jako reakce na potřebu zpracovávat
XML soubory (původně pro Javu)
DOM (Document Object Model)
---------------------------
- dokument reprezentován jako stromová hierarchie objektů
reprezentujících elementy, atributy, textový obsah atd.
- celá hierarchie v paměti
- obecné rozhraní (funkce) pro procházení a modifikaci dokumentu
- výhody: jednoduchý (objektový) náhodný přístup -> editory,
prohlížeče, pohodlnější přístup k dokumentu
- nevýhody: nižší rychlost, paměťová náročnost
- standard W3C, původně jednotný objektový model pro prohlížeče
(využití skriptovacím jazyce JavaScript), různé úrovně (0, 1, 2, 3)
document.getElementById("elementID")
XPath
-----
- DOM a SAX komplexní -> zjednodušení práce s XML dokumenty -
dotazování na DOM stromem, výběr částí stromu
- dotazovací jazyk pro adresaci elementů, aributů i textu pomocí výrazů
- použití zejména jinými jazyky založenými na XML (např. XSL)
- kompaktní a intuitivní, podobné adresaci souborů v souborovém systému
/element//subelement/*
- pro vyhodnocení výrazu potřeba kontext = aktuální uzel v hierarchii
elementů a sada kontextových uzlů
- standard W3C z rodiny XML
Data-binding
------------
- v případě validujícího parseru poskytujícího infoset oproti schématu
s datovými typy (viz Schémata)
- elementy a atributy jako datové struktury programovacího jazyka -
automaticky vygenerovaný kód
- objektový model
Další
-----
- dotazovací API, volání XSL transformací, př. TrAX
- InfoSet (XML Information Set) - snaha W3C o jednotný datový model,
jaké informace jsou v dokumentu?, přišel pozdě
Programovací jazyky
-------------------
Java
....
- nejvíce knihoven (také historický důvod), prověřená řešení
- Xerces (DOM, SAX), XP a další
- rozhraní JAX (Java API for XML): JAXP (... Processing) - zpracování
(DOM, SAX, XSLT), JAXB (Java Architecture for XML Binding) -
data-binding a další
- JAXP: standarní API pro XML, metody pro vytvoření parseru - aplikace
nazávislé na implementaci parseru
SAXParserFactory spf = SAXParserFactory.newInstance();
SAXParser parser = spf.newSAXParser();
MyHandler handler = new MyHandler();
parser.parse("faktura.xml", handler);
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = dbf.newDocumentBuilder();
Document doc = builder.parse("soubor.xml");
NodeList nl = doc.getElementsByTagName("jmeno");
for (int i=0; iroot->childs; node != NULL; node = node->next)
node = xmlDocGetRootElement(doc);
if (xmlStrcmp(node->name, (const xmlChar *) "jmeno"))
node = node->xmlChildrenNode;
atr = xmlGetProp(xmlnode,"jmeno");
context = xmlXPathNewContext(doc);
result = xmlXPathEvalExpression(xpath, context);
doc = xmlNewDoc("1.0");
doc->root = xmlNewDocNode(doc, NULL, "Genealogy", NULL);
newxml = xmlNewChild(xmlnode,NULL,"jmeno",NULL);
xmlNewProp(newxml,"jmeno",data);
xmlSaveFormatFile (docname, doc, 1);
static xmlSAXHandler my_handler { };
struct ParserState { };
xmlSAXUserParseFile(&my_handler, &my_state, filename);
Nový XmlTextReader podobný .NET:
reader = xmlNewTextReaderFilename(filename);
ret = xmlTextReaderRead(reader);
while (ret == 1) { processNode(reader); ret = xmlTextReaderRead(reader); }
name = xmlTextReaderName(reader);
value = xmlTextReaderValue(reader);
xmlTextReaderNodeType(reader);
- Xerces (C++): DOM, SAX, data-binding do C++, mnoho platforem (open
source)
class MySAX2Handler : public DefaultHandler { public: void startElement; }
XMLPlatformUtils::Initialize();
SAX2XMLReader* parser = XMLReaderFactory::createXMLReader();
DefaultHandler* defaultHandler = new DefaultHandler();
parser->setContentHandler(defaultHandler);
char* xmlFile = "soubor.xml";
parser->parse(xmlFile);
XMLPlatformUtils::Initialize();
XercesDOMParser* parser = new XercesDOMParser();
char* xmlFile = "soubor.xml";
parser->parse(xmlFile);
docRootNode = someDocument->getDocumentElement();
aNode = someDocument->createElement(anElementName);
Další
.....
- PHP (funkce xml_*, XMLReader), Perl (XML::Parser), atd.
Schémata (schémové jazyky)
==========================
Úvod
----
- libovolné značky v XML znamenají příliš volnosti, potřeba známé
struktury (sémantiky) -> odvození nového značkovacího jazyka
(založeného na XML) pomocí jeho schématu zapsaného pomocí schémového
jazyka
- jednoznačně formálně definuje značkovací jazyk (datový formát)
založený na XML
- vyjadřuje typ XML dokumentu, požadavky na značky, jejich strukturu a
obsah (jaké elementy, atributy a obsah), někdy také datové typy
- hlavní použití: validace oproti schématu = ověření, zda XML vyhovuje
schématu (má správnou sémantiku), nutná při výměně a čtení XML
dokumentu, podpora parsery
- může sloužit i jako dokumentace definovaného jazyka, zdroj pro
vytvoření objektového modelu při data-bindingu, apod.
- př. schémata XHTML, XSL, SVG, MathML, DocBook, WML, RSS/Atom, ...
Historie
--------
- přímo ve standardu XML jazyk DTD, nevýhody pro IS a web (zejména
chybějící datové typy a jmenné prostory), už v době vzniku XML vývoj
schémových jazyků, př. SOX, DSD, DDML (XML DTD), DT4DTD (Data Types
for DTD), většina nepřežila, proprietární
- XML-Data (1998) - jazyk ani ne tak pro schéma XML jako pro definici
charakteristik tříd objektů, složitý -> XDR (XML-Data Reduced) - M$
produkty (XML parser, SQL Server 2000)
- XML Schema (2001), velká podpora, dostačující, ale složitější ->
RelaxNG, elegantní, pro negramatický pravidlový popis Schematron,
kombinace
- jednotný rámec pro validaci oproti více schématům: projekt DSDL
(Document Schema Definition Languages) - řešení problému jmenných
prostorů?
Document Type Definition (DTD)
------------------------------
- přímo ve standardu XML (ještě z dob SGML) - díky široké podpoře
všemi parsery se stále používá, ale zastaralé
- stačí na použití XML jako strukturovaného formátu elektronicky
publikovaného dokumentu, nestačí ale na XML v IS (faktury, apod.),
webových službách apod. - chybí zejména datové typy (jen textový
obsah) a jmenné prostory (problematická rozšíření)
- definice gramatiky jazyka - popis struktury, pravidla na
subelementy, atributy a hodnoty
- mnoho existujících standardních DTD pro XML jazyky, např. (X)HTML,
DocBook
- nestandardní jazyk, který není XML, podobný reg. výrazům
- kódování UTF-8 nebo UTF-16 nebo na začátku instrukce xml:
Definice elementu:
- model obsahu v ()
- uspořádané podelementy oddělené čárkou
- volba jednoho z několika oddělených | (v závorkách)
- volitelný podelement - za jménem ?
- opakování - za jménem + (min 1x), *, přesnější zadání několikerým
uvedením
- textový obsah: #PCDATA
- smíšený obsah: (#PCDATA | podelement | ...)*
- prázdný obsah: EMPTY
- jakýkoliv podelement nebo text: ANY (ale jen deklarované!)
Definice atributu:
- typy: CDATA (libovolný text), NMTOKEN (slovo, omezení jako u jmen
elementů a atributů), NMTOKENS (slova oddělená mezerou), ID
(identifikátor jedinečný v rámci celého dokumentu pro všechny
atributy typu ID, u elementu max. jeden atribut typu ID), IDREF a
IDREFS (odkaz(y) na nějaký atribut typu ID)
- výčet hodnot: ("h1" | "h2" | ...)
- výchozí hodnota: zadaná, #REQUIRED - musí být v XML zadaná, #IMPLIED
- záleží na parseru
- před výchozí hodnotou #FIXED - atribut může obsahovat jen výchozí
hodnotu
Definice textových entit (nejen znakové, ale libovolný řetězec, lze
jen v DTD):
- používané v DTD - před jménem %
- systémové - použití pro modularizaci (rozdělení XML dokumentu do
více souborů a vložení)
Komentáře:
- XML, mezi deklaracemi
Připojení schématu ke XML:
- specifikováno hned za instrukcí xml
- lokální - součást XML:
- externí:
- kombinace - lokální mají přednost
- identifikace (standardních DTD):
W3C XML Schema (WXS), XML Schema (Definition) (XSD)
--------------------------------------------------
- základ: vše je datový typ (typ elementu, atributu, hodnoty),
definice podtypů
- definice gramatiky jazyka pomocí typů
- hierarchie zabudovaných jednoduchých typů: řetězec, celá a
desetinná čísla, datum a čas, časový interval, URI, typy z DTD,
binární data, aj.
- definice (vlastních) jednoduchých typů - restrikce (omezení pro
zabudované typy) nebo rozšíření (seznam, sjednocení)
- definice (vlastních) komplexních typů pro elementy
- XML jazyk (definovaný schématem XML Schema), elementy patří do
jmenného prostoru http://www.w3.org/2001/XMLSchema (prefix xs nebo
xsd)
...
- OO rysy - odvozování datových typů = dědičnost, ADT, možnost
zablokovat odvození
Definice jednoduchého typu hodnot:
- omezení (restriction) pro řetězce: length, min/maxLength,
enumeration (výčet), pattern (reg. výraz, Perl)
- omezení pro čísla: min/maxIn/Exclusive, total/fractionDigits
- normalizace hodnot = tabulátory a nové řádky na jednu mezeru (ne u
řetězcových typů) -> lexikální reprezentace, prostor hodnot ->
abstraktní reprezentace hodnoty, př. 10, 10.000, 1.0E1 -> 10
Definice komplexního typu:
...
- typy v pořadí:
...
- volba:
...
- nezáleží na pořadí typů (výskyty pouze od 0 do 1, nelze kombinovat):
...
- opakování: atributy min/maxOccurs (výchozí 1, nekonečno "unbounded")
- smíšený obsah: atribut mixed="true", jiný než v DTD -> volba s
libovolným počtem výskytů
Definice elementu:
- anonymní typ:
...
- odkaz na definici elementu: atribut ref="jmeno"
Definice atributu v definici elementu:
- atributy se definují až na konci komplexního typu
- povinný atribut: atribut use="required"
- výchozí hodnota atributu: atribut default="hodnota"
Referenční integrita:
- podpora pro použití relačních databází (uložení tabulek)
- jedinečné hodnoty množiny (pod)elementů a atributů
...
- klíč = jedinečné a nastavené hodnoty
...
- cizí klíč = odkaz na klíč
...
- množina určená XPath výrazy:
Jmenné prostory:
- atribut targetNamespace u xs:schema, i jako implicitní (atribut xmlns)
- bohužel patří jen kořenové elementy -> atributy elementFormDefault a
atributeFormDefault
Modularizace:
- vložení podschématu:
- podschéma z jiného jmenného prostoru:
Komentáře:
- anotace:
blah
- jiný XML jazyk, např XHTML -> jiný jmenný prostor, např.
xmlns:html="http://www.w3.org/1999/xhtml"
- nástroje pro vygenerování dokumentace ke schématu, např. webové
stránky: xs3p (XSLT styl)
Připojení schématu ke XML:
- pomocí atributů ze jmenného prostoru
http://www.w3.org/2001/XMLSchema-instance (prefix xsi)
- schéma bez jmenných prostorů:
...
- schéma se jmennými prostory:
...
Relax NG (RNG, RNC)
-------------------
- XML Schema složité a příliš obecné
- založeno na vzorech (a matematické teorii hedge automatů a gramatik),
celé schéma vzor, definice (pod)vzorů
- definice regulární gramatiky jazyka (ReLaX = Regular Language for
XML) pomocí vzorů
- XML zápis (RNG, jmenný prostor http://relaxng.org/ns/structure/1.0,
prefix rng)
...
- a kompaktní zápis (RNC) - mnohem úspornější, s XML navzájem převoditelné
element jméno {
...
}
- OASIS (2001) a ISO standard (2003)
- převzaté datové typy, nejčastěji z XML Schema
Definice vzorů:
- text:
text
- atribut (kdekoliv v definici elementu):
attribute jmeno { text }
- element:
...
element jmeno { ... }
- prázdný element (i bez atributů):
empty
- volitelný vzor:
...
...?
- opakování (výchozí 1):
..., ...
...+, ...*
- chybí přesný počet opakování -> povinné a volitelné, nebo méně
restriktivní vzor a Schematron
- podlementy v pořadí:
... (samostatně není nutné)
(... , ...) (v závorkách skupina vzorů)
- volba:
...
(... | ...)
- nezáleží na pořadí podelementů:
...
(... & ...)
= prolínání ve skupinách - mnohem mocnější než v DTD nebo XML Schema,
např. jednoduše umožňuje uspořádané podelementy proložené elementem:
element jmeno {
(element prvni { text },
element druhy { text },
element treti { text }) &
element poznámka { text }*
}
- smíšený obsah = prolínání se vzorem text (není potřeba opakování) nebo
...
mixed { ... }
Datové typy:
- velmi omezená podpora dat. typů, jen string a token -> externí
knihovna dat. typů, např. z XML Schema
- určení datového typu obsahu elementu nebo atributu - vzor data (RNG)
nebo rovnou typ s prefixem knihovny (RNC):
datatypes xs = "http://www.w3.org/2001/XMLSchema-datatypes"
xs:decimal
- pro XML Schema předdefinovaný prefix xsd:
xsd:decimal
- dědění definice knihovny na podelementy -> jen v kořenovém
- normalizace hodnot
- parametry dat. typů (restrikce v XML Schema):
hodnota
xsd:typ { parametr = "hodnota" }
- výčet (typ je výchozí string):
...
...
typ "..." | typ "..."
- vyloučené hodnoty:
...
typ - "..."
- seznam hodnot (struktura bílými znaky bez značkování) - opakování, výčet,
vyloučení hodnot, různé dat. typy hodnot
cm
mm
list { xsd:decimal, ("cm" | "mm") }
Kontextové modelování obsahu:
= obsah vzoru závisí na hodnotě obsahu podvzoru - díky lib. kombinování
vzorů i s konkrétní hodnotou
- většina schémových jazyků neumí (včetně XML Schema)
element osoba {
...,
((attribute pohlavi { "muz" },
...) |
(attribute pohlavi { "zena" },
...))
}
Jmenné prostory:
- v definici elementu a atributu atribut ns="URI" pro RNG, pro RNC
default namespace = "URI"
- dědění z nadelementů, u atributů nutné zadat explicitně
- prefix pomocí atributu xmlns:prefix="URI" pro RNG, pro RNC
namespace prefix = "URI"
Modularizace:
- velmi silná
- pojmenování a použití vzorů - zpřehlednění schématu:
...
jmeno = ...
jmeno
- potřeba určit kořenový element (startovací symbol gramatiky):
...
start = ...
- aby zůstala XML syntaxe RNG -> jeden kořenový element:
...
- vložení podschématu:
include "soubor.rnc"
Komentáře:
- anotace - vlastní jmenný prostor
xmlns:a="http://relaxng.org/ns/compatibility/annotations/1.0"
...
## ...
- jiný XML jazyk, např XHTML -> jiný jmenný prostor, např.
xmlns:html="http://www.w3.org/1999/xhtml"
...
[ html:p [ "..." ] ] (speciální notace pro XML)
Připojení schématu ke XML:
- pro Relax NG schéma bohužel není podpora
Schematron (SCH)
----------------
- DTD, XML Schema i Relax NG definují gramatiku XML dokumentu
- Schematron je založen na vyhodnocování podmínek tvrzení pro vzory
s kontexty vyhodnocování vymezenými XPath výrazem => použití téměř
výhradně pro validaci
- výsledkem validace je seznam tvrzení
- podmínky platnosti tvrzení vyjádřené XPath výrazem, např.
porovnávání obsahu elementů a atributů (i napříč dokumenty),
kontrola hodnot oproti číselníku (v jiném souboru), atd.
- použití spíše jako doplněk ke XML Schema a RelaxNG pro věci, které
neumí, ale umožňují vložit Schematron schéma
název schématu
...
Definice vzoru:
...
- vzor obsahuje pravidla vymezující kontext pro vyhodnocení podmínek
tvrzení, daný XPath výrazem:
...
- XPath výraz udává vzor pro vybrané uzly dokumentu (elemeny, atributy)
- pravidla obsahují tvrzení s podmínkami (ne)platnosti vyjádřenými XPath
výrazem:
tvrzeni
tvrzeni
- pokud je podmínka splněna (report) nebo nesplněna (assert), je
tvrzení výsledkem validace
- v tvrzení (textu validačního hlášení) může být:
-> jméno aktuálního elementu z kontextu
-> hodnota XPath výrazu
Validace:
- speciální parsery nebo
- XSLT procesor - existuje XSLT styl převádějící Schematron schéma na
XSLT styl transformující XML dokument na seznam tvrzení
$ xsltproc -o validacni.xsl skeleton1-5.xsl schema.sch
$ xsltproc validacni.xsl dokument.xml
Duplicitní osobní číslo 100 u elementu zamestnanec.
Zaměstnanec nemůže mít více než jedno jméno a příjmení.
Vložení do XML Schema:
- vkládání vzorů pomocí elementu appinfo do anotace:
...
...
...
Vložení do Relax NG:
- vkládání vzorů téměř kamkoliv:
...
...
namespace sch = "http://www.ascc.net/xml/schematron"
element jmeno {
>> sch:pattern [
name = "..."
sch:rule [ ... ]
...
]
...
}
- validace XML Schema i Relax NG s vloženým Schematronem buď speciálním
validátorem nebo extrakce Schematron schématu pomocí XSLT
Pravidla používání schémat
--------------------------
Přístupy k návrhu:
- rozšiřitelnost schématu, použitelnost v jiných schématech
1. jeden kořenový element a vše v něm - v XML kořenový jen ten,
podelementy nelze použít jinde
2. více kořenových elementů a odkazy - v XML kořenový lib. z nich,
lib. lze použít jinde, jen jeden model obsahu v závislosti na kontextu
3. kombinace - typy elementů, definice elementů lokálně pomocí těchto typů
Elementy vs. atributy:
- vždy jde místo atributu použít podelement, jsou atributy zbytečné?
- atributy: kratší zápis (ruční editace), ale struktura dána elementy,
zjednodušení modelu obsahu (?)
- u elementu nelze mít dva atributy stejného jména
- hodnotu atributu nelze strukturovat pomocí podelementů, potřeba
strukturovat -> podelement
-> do atributů pouze hodnoty se známým omezeným oborem hodnot (čísla)
Jmenné prostory:
- každý XML jazyk by měl mít elementy ve vlastním jmenném prostoru,
elementy bez prostoru nejde jednoznačně kombinovat
- atributy ne
- název tvar URI (URN nebo URL)
- URN: experimentální prostor začínající x (urn:x-pokus:...) nebo
odvozený z doménového jména (urn:cz-upol:...), pak vyznačení jmenného
prostoru (...:ns:...) a jméno schématu
- URL: na adresu lze dát dokumentaci schématu (HTML nebo RDDL), při
zpracování se nic z URL nestahuje, nebezpečí kolize -> první část
cesty ns/
Názvy elementů a atributů:
- ne extrémy jako 3 písmena nebo 30 písmen
- slova s velkými počátečními písmeny nebo oddělená pomlčkou či
podtržítkem, jednotně!
Verzování schémat:
- důvod: nové požadavky
- atribut version u kořenového elementu, u velkých změn i změna jmenného
prostoru
Rozšiřitelnost:
- vývoj nebo i potřeba jiných elementů -> otevřené schéma pomocí
libovolných podelementů:
anything = element * {
(attribute * { text } | text | anything)*
}
- před libovolné podelementy nedávat volitelný element -> nejednoznačnost
Který schémový jazyk?:
- není potřeba jmenných prostorů a datových typů, jednoduchá struktura,
největší podpora -> DTD
- komerční vývojové nástroje a knihovny velkých firem -> XML Schema
- jinak jednodušší RelaxNG (RNC)
- jednoduchý převod mezi schémovými jazyky
XML parsery
-----------
1. well-formedness
2. validace oproti schématu
- dnes většina podporuje DTD, XML Schema, RelaxNG, některé i Schematron
- xmllint (C, DOM, SAX, z balíku libxml2, xmlsoft.org), Xerces
(C++, Java, DOM, SAX, xerces.apache.org), a další
- převod schémat: trang, XML Authority
Srovnání
--------
XML:
Josef
Vyskočil
pepek.vyskoc@rakousko-uhersko.cz
informátor
5
Flanderka
vachmajstr.putim@rakousko-uhersko.cz
strážmistr
DTD:
XML Schema:
Relax NG, XML syntaxe:
Relax NG, kompaktní syntaxe:
element zamestnanci {
element zamestnanec {
attribute id { xsd:int },
element jmeno { text }?,
element prijmeni { text },
element email { xsd:string },
element pozice { xsd:string }+,
element mzda { xsd:decimal }?,
}*
}
Schematron:
U zaměstnance musí být zadáno jeho osobní číslo (id).
Zaměstnanec musí mít příjmení.
Zaměstnanec musí mít e-mail.
Zaměstnanec musí mít pozici.
Zaměstnanec nemůže mít více než jedno jméno a příjmení.
Duplicitní osobní číslo u elementu .
Zpracování a zobrazení XML
==========================
Zobrazení
---------
- základní myšlenka XML: oddělení obsahu (význam, co je co) od vzhledu
(jak to vypadá) -> styl
- výhody: více vzhledů jednoho dokumentu: web - PC, mobily, PDA,
tiskárny, ..., jeden (jednotný) vzhled pro více dokumentů:
web, faktury -> editace na jednom místě
- bez stylu záleží na aplikaci (webovém prohlížeči): strom elementů s
obsahem, jen textový obsah elementů, apod.
- zápis stylu pomocí stylových jazyků, např. XSL (FO) nebo CSS:
XSL Transformace (XSLT)
-----------------------
- klíčové pro zpracování XML dokumentů
- XSL = eXtensible Stylesheet Language, W3C standard, verze 1.0 1999,
http://www.w3.org/TR/xslt
- původně stylový jazyk umožňující definovat vzhled elementů: zarovnání,
písmo, barvy apod., také automatické generování obsahu, číslování ->
oddělení transformace a vzhledu
- transformace = XSLT (XSL Transformations), styl definuje převody
elementů do jiného XML, HTML, textu nebo čehokoliv jiného (SQL),
pomocí XSLT procesoru
- XSLT procesory (i jako knihovny): Saxon (Java), xsltproc (C, funkce
v C), Xalan (Java, C++, funkce v jiném jazyce), MSXML (C++, COM,
funkce ve skriptovacích jazycích, součást M$ produktů), .NET
System.Xml (součást .NET, funkce v jazycích .NET, řádkové nxslt) nebo
přímo ve webovém prohlížeči (IE6/7, Mozilla/Firefox)
- použití pro převod v reálném čase naráží na výkonnostní problémy ->
kompilátory, např. Java translety (Sun)
- vzhled: formátovací objekty, XSL FO (XSL Formatting Objects) = CSS +
layout stránky - více sloupců, hlavičky, atd., XSLT stylem se z XML
dokumentu vytvoří XML s formátovacími objekty, který interpretuje
procesor FO do např. PDF
- procesoty FO: FOP, XEP, XSL Formatter
- připojení ke XML, i více (pro různá výstupní zařízení):
...
Definice stylu:
- XSLT styl = XML dokument - značky (instrukce) pro XSLT procesor a
případně značky výsledného dokumentu (např. HTML)
- značky pro XSLT procesor: jmenný prostor
http://www.w3.org/1999/XSL/Transform, prefix xsl
... šablony ...
- obsah stylu: šablony definující převod částí (elementů) XML dokumentu,
obsahují XSLT instrukce
- postup aplikace stylu: řízený obsahem dokumentu, kdy se šablony
volají během parsování XML dokumentu (složitá struktura XML, hodně
šablon), nebo opačně řízený stylem, kdy šablona vybírá části
dokumentu ke zpracování (jednodušší struktura XML, málo šablon),
nebo kombinace
- části XML ke zpracování v šablonách, vzory elementů, na které se
aplikuje šablona, a generování textu na výstup - dotazovací
jazyk XPath
XPath
.....
- dotazovací jazyk pro zápis výrazů, jejichž výsledkem je (nejčastěji)
množina uzlů = elementů a atributů v abstraktním modelu dokumentu
Astraktní model dokumentu:
- strom uzlů pro: kořen (umělý, potomci kořenový element, poznámky,
instrukce), elementy (hodnota = spojení textových uzlů), atributy
(připojen k elementu - rodič, listový), text (textový obsah,
nahrazeny entity, listový), instrukce pro zpracování (listový, název
= cíl instrukce), komentáře (listový), jmenné prostory (připojen k
elementu - rodič, listový, název = prefix, dědění)
- mírné odlišnosti od modelu DOM
- vztahy mezi uzly (osy z aktuálního uzlu): rodič, předek,
předchozí/následující (sourozenec), dítě, potomek
- spousta textových uzlů reprezentujích jen mezery a konce řádků -
XSLT procesor je může ignorovat
Výrazy:
- hodnoty: true/false, číslo, textový řetězec, množina uzlů, část
stromu dokumentu (XSLT)
- výběr uzlů pomocí cesty: od aktuálního uzlu (určen XSLT), od kořene,
z jiného určeného uzlu (např. funkcí id), oddělovač /, části pro
osu, test uzlu (jméno), predikáty omezující výběr uzlů
- zkrácený zápis: pro osy implicitně dítě, aktuální = ., rodič = ..,
potomci = //, pro testy uzlu element = jméno, atribut = @jméno,
text = text(), lib. uzel s názvem = *, a další
/zamestnanci//prijmeni/text() -> (texty) příjmení zaměstnanců
- predikáty v []: vyhodnocení pro každý uzel doposud na cestě, funkce
v predikátu mouhou vracet číslo (= pozice/vzdálenost uzlu v množině na
ose), množinu uzlů, ostatní převedeny na true/false
//zamestnanec[last()] -> poslední zaměstnanec (element)
//zamestnanec[mzda/text() > 10] -> zaměstnanec, jehož mzda > 10
- kontext pro vyhodnocení: aktuální uzel, jeho pozice v množině
kontextových uzlů, proměnné, aj.
- při vyhodnocování se mění aktuální uzel a množina, množinu lze
vyznačit pomocí ():
//*[3] -> všechny třetí děti svých rodičů
(//*)[3] -> třetí element v celém dokumentu
- operátory: sjednocení množin uzlů |, logické spojky and a or,
relační =, !=, <, <=, >, >= (< a >), aritmetické +, -, *, div,
mod
- funkce: uzlové position(), last(), name(mn), local-name(mn), řetězcové
string-length(r), concat(r1, r2, ...), substring-after (r, hr),
logické not(v), true(), false(), lang(), číselné sum(mn), round(n)
- funkce v XSLT: document(r) - uzly z jiného dokumentu (URI v r),
format-number(n, r, r), current(), system-property(r) aj.
document('soubor.xml')/zamestnanci
Šablony:
- definice šablony:
...
- obsahem šablony jsou XSL instrukce zpracování částí dokumentu
vyhovujících XPath vzoru (výraz používající jen osy potomků, elementy
a atributy) a text (značky) výsledného dokumentu
- zpracování šablon: XSLT procesor prochází strom dokumentu do hloubky,
pokud je šablona pro uzel, její (zpracovaný) obsah jde na výstup,
potomci se nezpracovávájí, jinak implicitní šablona
- záleží na pořadí elementů v dokumentu, ne na pořadí šablon ve stylu
- výběr uzlů k dalšímu zpracování:
- pozor na cyklus!
- zpracovat všechny děti (a jejich podstrom,
jen elementy)
- režim zpracování šablony pro opakovanou aplikaci šablony jiným
způsobem: atribut mode="nazev" u xsl:template a xsl:apply-templates
- více platných šablon pro jeden uzel -> priorita šablony (atribut
priority nebo automaticky - čím specifičtější vzor, tím vyšší)
- implicitní šablony: pro postupné zpracování do hloubky, kopírování
textových uzlů a nezpracovávání komentářů a XML instrukcí pro
zpracování
- pro řípad celý styl = jedna šablona pro kořenový element se může
uvést rovnou obsah šablony, bez xsl:template
Instrukce pro zpracování:
- dají se zanořovat, obsahem instrukce mohou být jiné instrukce
- všechny elementy včetně obsahu nepatřící do jmenného prostoru
XSLT (prefix xsl) a text jdou na výstup
- text bez bílých znaků:
nějaký text
- textový obsah uzlů (bez aplikace šablon pro poduzly):
- výsledek výrazu do atributu výstupního elementu:
...
- jméno elementu nebo atributu:
obsah elementu - výraz např.
concat('l', 'i') -> ...
hodnota atributu - musí být
hned za otevíracím tagem elementu, výraz např. href
- komentář:
text komentáře ->
- XML instrukce pro zpracování:
echo "PHP"
->
- cyklus - aplikace obsahu pro každý uzel (= aktuální uzel) z množiny
dané výrazem:
...
- podmínka - obsah se aplikuje, pokud platí podmínka daná výrazem:
...
- podmíněné větvení - více podmínek + výchozí větev (else):
...
...
...
TODO
Rozšíření XSL:
- výstup do více souborů
- externí funkce v javě nebo JavaScriptu
- EXSLT
Postup zpracování XML dokumentu:
1. navržení schématu dokumentu - DTD, XML Schema nebo RelaxNG,
případně Schematron
2. vytvoření (editace) dokumentu podle schématu + validace
3. vytvoření (vzhledového nebo transformačního) stylu dokumentu - CSS
nebo XSLT (FO) + transformace
4. použití (zobrazení) dokumentu - aplikace, webový prohlížeč, atd.
Příklad
-------
Zaměstnanci
Zaměstnanci
Email:
Pozice:
Mzda:
Zdroje informací
================
www.kosek.cz
zvon.org
www.w3c.org
relaxng.org
schematron.com
www.xml.org
...
Kosek J.: XML pro každého, podrobný průvodce. Grada Publishing,
2000. ISBN 80-7169-860-1 (http://www.kosek.cz/xml/xmlprokazdeho.pdf)
... (mnoho)