Obsah
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.
SGML jako standard ISO 8879: http://www.iso.ch/cate/d16387.html
Stručný "laický" úvod do SGML: http://www.sil.org/computing/noc/156ac.htm
Další stručný, věcný ale přesný úvod do SGML: http://www.oasis-open.org/cover/naggumWhat.html
Další Úvod do SGML: http://www.personal.u-net.com/~sgml/sgml.htm
Srovnání SGML-XML a další zdroje: http://www.oasis-open.org/cover/sgml-xml.html
World Wide Web Consortium (W3C): http://www.w3.org/
Přehled XML aktivit W3C: http://www.w3.org/XML/Activity - specifikace standardů, konference, odkazy na SW, referenční nástroje, odkazy (obnovováno podle potřeby)
XML Startkabel (EN/NL): http://xml.startkabel.nl - aktuality, odkazy (obnovováno cca 1x týdně)
Zvon: http://zvon.org - asi nejlepší soubor tutoriálů, on-line referencí v mnoha jazycích, místo je hostované v ČR.
What is XML? na XML.COM: http://www.xml.com/pub/a/98/10/guide0.html - jeden z úvodních článků ke XML
The Extensible Markup Language (XML) USENET newsgroup: news:comp.text.xml - nejznámější USENET news skupina ke XML
XML-DEV: mailto:xml-dev@xml.org - nejznámější maillist ke xml standardům
Archív xml-dev: http://lists.xml.org/archives/xml-dev/ - archív předchozího maillistu
XML: XML Quick Syntax Reference Card - výborná stručná referenční karta
IBM DeveloperWorks, sekce XML: http://ibm.com/developer/xml - články, tutoriály, software atd. na vysoké technické úrovni
IBM AlphaWorks: http://www.alphaworks.ibm.com - alpha-software fy IBM k volnému vyzkoušení
O'Reilly XML.COM: http://xml.com - články, tutoriály atd. na vysoké technické úrovni
Free XML Software (L. M. Garshol): http://www.garshol.priv.no/download/xmltools/ - asi nejlepší kolekce odkazů na nekomerční XML software
XMLSoftware: http://xmlsoftware.com - asi nejlepší kolekce odkazů na obecný XML software (i komerční)
XML Cover Pages na www.oasis-open.org: xml.coverpages.org - denně aktualizovaný soubor odkazů na články, publikace standardů, software, atd. v oblasti XML. Nejlepší zdroj v této kategorii.
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.
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.
vyňato z preambule ke specifikaci XML 1.0 (Second Edition)
XML shall be straightforwardly usable over the Internet.
XML bude přímočaře použitelné na Internetu.
XML shall support a wide variety of applications.
XML bude podporovat širokou škálu aplikací.
XML shall be compatible with SGML.
XML bude kompatibilní se SGML.
It shall be easy to write programs which process XML documents.
Tvorba programů zpracovávajících XML bude jednoduchá.
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.
XML documents should be human-legible and reasonably clear.
XML dokumenty by měly být "lidsky" čitelné a rozumně jednoduché.
The XML design should be prepared quickly.
Návrh XML standardu by měl být rychle hotov.
The design of XML shall be formal and concise.
Návrh XML musí byt formální a správný.
XML documents shall be easy to create.
XML dokumenty bude možné snadno vytvořit.
Terseness in XML literal is of minimal importance.
Úspornost XML značkování není podstatná.
Základním požadavkem kladeným na každý XML dokument je, že musí být dobře utvořen (well-formed).
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)
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.
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ě
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.
Jsou objekty ohraničené počáteční a koncovou značkou - start and end tag, např.:
<tagname ...tag_attributes...>
tag_content
</tagname>
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/>
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ší...
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.
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">
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,...
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).
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é informace k syntaxi se dozvíme v následující kapitole Standardy rodiny XML
Původní specifikace (W3C Recommendation) XML 1.0 na W3C: http://www.w3.org/XML/
3rd Edition (aktualizace, ne změny) na http://www.w3.org/TR/2000/REC-xml-20001006
výborná komentovaná verze téhož na XML.COM (Annotated XML): http://www.xml.com/pub/a/axml/axmlintro.html
na XML 1.1 (Candidate Recommendation) - změny indukované zavedením UNICODE 3, lepší možnosti normalizace, upřesnění postupu manipulace se znaky ukončení řádku.
(výborný úvodní) Koskův seriál o XML pro Softwarové noviny: http://kosek.cz/clanky/swn-xml/index.html
(obsahuje hodně příkladů) Zvon XML Tutorial: http://www.zvon.org/xxl/XMLTutorial/General/book_en.html
Microsoft XML Tutorial: http://msdn.microsoft.com/xml/tutorial/
101 XML Tutorials: http://www.xml101.com/xml/default.asp
Tutoriály na Developerlife.com: http://developerlife.com
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
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í.
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.
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ě).
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á...
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ý).
Webreview: http://www.webreview.com/2000/08_11/developers/08_11_00_2.shtml
ZVON: http://www.zvon.org/xxl/DTDTutorial/General/contents.html
XML DTD Tutorial (101): http://www.xml101.com/dtd/
W3Schools DTD Tutorial: http://www.w3schools.com
Uvádí se těsně před kořenový elementem konstrukcí
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í
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.
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>
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">
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).
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.
V následující ukázce je pro celý úryvek platný deklarovaný implicitní jmenný prostor charakterizovaný URI (URL) http://www.w3.org/1999/xhtml
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
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 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
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ů.
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>
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.
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 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.
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.
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í
dovolují libovolně procházet ("traverse") vzniklý strom;
nejznámější je Document Object Model (DOM) konsorcia W3C, viz http://www.w3.org/DOM
pro Javu: JDOM - http://jdom.org
pro Javu: dom4j - http://dom4j.org
pro Python: 4Suite - http://4suite.org
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
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
<?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
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)
Chování parseru produkujícího SAX události je možné ovlivnit nastavením tzv. features a properties.
Vlastnosti (features) nastavitelné pro analýzu (parsing) http://www.saxproject.org/?selected=get-set
Blíže k jednotlivým properties a features v článku Use properties and features in SAX parsers (IBM DeveloperWorks/XML).
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).
"Přímo od zdroje" http://www.saxproject.org
SAX Tutorial k JAXP - http://java.sun.com/webservices/docs/ea1/tutorial/doc/JAXPSAX.html
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).
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 |
---|---|
příklad převzat z Tip: Use XML streaming parsers (IBM DeveloperWorks, sekce XML). |
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 |
---|---|
příklad převzat z Tip: Use XML streaming parsers (IBM DeveloperWorks, sekce XML). |
Tutoriál k JAXP, část věnovaná DOMPart III: XML and the Document Object Model (DOM)
Portál věnovaný DOM http://www.oasis-open.org/cover/dom.html
Vizuální přehled DOM 1 rozhraní http://www.xml.com/pub/a/1999/07/dom/index.html
Tutoriál "Understanding DOM (Level 2)" na http://ibm.com/developer/xmlhttp://ibm.com/developer/xml
v mnoha parserech, např. Xerces
jako součást JAXP (Java API for XML Processing) - http://java.sun.com/xml/jaxp/index.html
i jako samostatné, nezávislé na parserech:
např. dom4j - http://dom4j.org
EXML (Electric XML) - http://www.themindelectric.net
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
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í
pohodlné, rychlé a pamětově efektivní stromově-orientované rozhraní
psané pro Javu, optimalizované pro Javu...
dostupné jako open-source na http://dom4j.org
nabízí perfektní přehled díky "kuchařce"
dom4j je výkonný, viz srovnání efektivity jednotlivých stromových modelů
DOM model dokumentu není přítomen v paměti, je zprostředkováván "on demand" při přístupu k jednotlivým uzlům
spojuje výhody událostmi řízeného a stromového modelu zpracování (rychlost + komfort)
implementován např. u procesoru Sablotron
(např. viz http://www.xml.com/pub/a/2002/03/13/sablotron.html
nebo http://www.gingerall.org/charlie/ga/xml/p_sab.xml)
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(!)
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).
Podle základního výrazového prostředku, kterým definujeme „správnou“ strukturu dokumentů, rozlišujeme jazyky schémat založené na:
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.
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“).
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.
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
Dát silnější prostředek pro specifikaci modelu XML dat než je DTD; mít možnost:
<xs:element name="element_name"> ... definice typu - je přímo zde - tzv. "local" nebo daná odkazem - tzv. "global" </xs:element>
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>
<xs:simpleType name="nameType"> <xs:restriction base="xs:string"> <xs:maxLength value="32"/> </xs:restriction> </xs:simpleType>
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>
Zhruba odpovídá konceptu "union" v C
Lze spojovat bázový typ a výčet hodnot
<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>
Lze definovat typ jako seznam hodnot oddělených bílými znaky
Dalším odvozením lze omezit počet prvků seznamu
<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>
<xs:complexType name="TypeName"> <xs:sequence> <xs:element ...> ... <xs:attribute ...> </xs:sequence> </xs:complexType>
při definici složeného typu lze použít skupiny (group)
<xs:group name="GroupName"> <xs:sequence> <xs:element ... /> ... </xs:sequence> </xs:group>
<xs:attributeGroup name="AttributesGroupName"> <xs:attribute ... use="required"/> ... </xs:attributeGroup>
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>
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
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>
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
<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>
<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>
Nelze validovat textový obsah (textové dceřinné uzly)
Lze validovat dceřinné elementy
<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>
Možnost specifikace integritních omezení:hodnota je jedinečná - xs:uniquehodnota je klíčem - xs:keyhodnota je odkazem na klíč - xs:keyref
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
<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>
<xs:include schemaLocation="character.xsd"/>
<xs:redefine schemaLocation="character12.xsd"> <xs:simpleType name="nameType"> <xs:restriction base="xs:string"> <xs:maxLength value="40"/> </xs:restriction> </xs:simpleType> </xs:redefine>
<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>
Umožní připustit i něco, co předem neznáme
<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>
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
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
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
[20] PathExpr ::= AbsolutePathExpr | RelativePathExpr [22] AbsolutePathExpr ::= ("/" RelativePathExpr?) | ("//" RelativePathExpr) [23] RelativePathExpr ::= StepExpr (("/" | "//") StepExpr)* [24] StepExpr ::= AxisStep | GeneralStep [25] AxisStep ::= (Axis? NodeTest StepQualifiers) | AbbreviatedStep
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.
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
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
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 na W3C: http://www.w3.org/TR/xpath
Zvon XPath Tutorial: http://zvon.org/xxl/XPathTutorial/Output/index.html
XPath Tutorial na W3Schools: http://www.w3schools.com/xpath/xpath_intro.asp
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
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
Vychází z pokročilých hypertextových technik -
HyTime (pro SGML - viz http://info.admin.kth.se/SGML/Anvardarforening/Arbetsgrupper/HyTime/Reports/tr1v1.html),
TEI
...
Konstruován tak, že rozšiřuje a upřesňuje syntaxi i sémantiku HTML odkazů
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.
Atributy a elementy XLinku mají vlastní
jmenný prostor
Jako prefix NS se obvykle používá
xlink
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
XPointer (http://www.w3.org/TR/xptr).
Váže jeden lokální zdroj na jeden vzdálený (single local -> single remote entity);
Je vyznačen atributem
xlink:type="simple";