Rodina formátů XML1 Karel Richta katedra počítačů ČVUT FEL Praha Karlovo nám.13, 212 35 Praha 2 e-mail:
[email protected],
Abstrakt Příspěvek přibližuje základy formátu XML a souvisejících standardů. Není určen jako podrobný popis formátu XML, ale měl by zdůraznit základní myšlenky, nastínit datový model XML, naznačit možnosti definice struktury dokumentů (jazyky DTD, XML Schema). Dále by se měl zabývat nástroji, které tvoří tzv. rodinu XML formátů. Patří sem zejména navigační jazyk XPath, transformační a dotazovací nástroj XSLT. Jako příklad aplikace jsou zde uvedeny protokoly založené na XML (např. SOAP).
1 Úvod Formát XML (eXtensible Markup Language [W3C04a]) definovalo konsorcium W3C (World Wide Web Consortium) jako formát pro přenos obecných dokumentů. Návrh XML vychází ze staršího a obecnějšího standardu SGML (Standard Generalized Markup Language - ISO 8879). Dokumenty v XML jsou tedy automaticky i dokumenty v SGML. SGML je ale složitější a komplikovanější, což je pravděpodobně příčina, proč nedošlo k jeho širšímu užití. Poznamenejme, že ze standardu SGML vychází i formát dokumentů HTML (Hyper-Text Markup Language [W3C99a]). Sada značek HTML je však pevná a slouží k vyjádření prezentační podoby dokumentu. Naproti tomu v XML sada značek pevná není, ale může být definována pro různé sady dokumentů různě. Značky mají tvar obecných závorek (tags), např.: <jmeno>Josef
Značky slouží k označení určitých prvků v dokumentu. Uvažme např. níže uvedenou hypotetickou zprávu, jednou bez značek a jednou s označením jména odesilatele: Jan Amos, Karel Hynek
Jan Amos, Karel Hynek
Ahoj!
Ahoj!
Pozdrav z říše divů!
Pozdrav z říše divů!
posílá Alenka
posílá <jmeno>Alenka
P.S.: Napište mi!
1
P.S.: Napište mi!
Tento článek vznikl při práci na výzkumných záměrech MŠMT 212300014 “Výzkum v oblasti informačních technologií a komunikací“ Českého vysokého učení technického v Praze, a byl též částečně sponzorován z grantu GAČR 201/03/0912 “Vyhledávání a indexování XML dokumentů“.
Vyznačíme-li jméno odesilatele, bude takový dokument lépe uchopitelný a bude možno jej zpracovat případně i programem. Definice sady značek může být součástí definice XML dokumentu, může být specifikována odkazem, nebo může být dohodnuta předem. Značky v XML slouží k vymezení logické struktury dokumentu. Můžeme např. stanovit, že dokument typu „zpráva“ musí obsahovat adresu (případně vynechanou, nebo i více adres), oslovení, text, podpis a případně dodatek. V XML tento požadavek zapíšeme následovně:
Vlastní obsah každé zprávy pak musí mít odpovídající tvar, např.:
Jan Amos Karel Hynek Ahoj! Pozdrav z říše divů! <podpis>Alenka <dodatek>Napište mi!
Pomocí značek XML vyznačíme syntaktickou strukturu dokumentu. Sémantika obsahu není pomocí XML definována. Např. pro výše zmíněnou zprávu nevíme, v jakém formátu se má tisknout, nevíme, jak jej zpracovat – to je věcí aplikací, které s tímto dokumentem manipulují. Význam XML spočívá v tom, že struktura dokumentu (v našem případě dokumentu typu „zpráva“) je známa, lze ji kontrolovat a zpracovat obecnými nástroji. Libovolná aplikace si může strukturu dokumentu zjistit a dle této struktury jej zpracovat. Význam jednotlivých částí dokumentu XML není pomocí XML definován – víme, že dokument typu „zpráva“ musí obsahovat element „oslovení“, ale není předepsáno, co se s oslovením má provést. Později se budeme věnovat možnostem zpracování XML dokumentů, např. jak můžeme XML dokument „přepsat“ na jiný dokument, jehož sémantika je známa – např. na dokument ve formátu HTML a v tomto formátu jej prezentovat. Různými předpisy lze popsat transformaci stejného dokumentu do různých formátů. Předpis pro transformaci XML dokumentu lze tedy chápat jako definici, kterou se vyjádří sémantika XML dokumentu. Potřeba nezávislého formátu pro reprezentaci a přenos obecných dokumentů je nesporná. Tento příspěvek představuje úvod, na který naváží další příspěvky. V následujícím textu proto bude popsán podrobněji formát XML a možnosti definice struktury dokumentů pomocí jazyka DTD (Document Type Definition). Dále se zde budeme zabývat nástroji, které tvoří tzv. rodinu XML formátů. Patří sem navigační jazyk XPath [W3C99c], transformační a dotazovací nástroj XSLT [W3C99b]. Jako příklad aplikace budou uvedeny protokoly založené na XML (např. SOAP [Ni01]). V dalších příspěvcích pak budou probírány novější a preciznější možnosti definice struktury dokumentů pomocí jazyka XML Schema [Ml04], některé významné aplikace formátu XML, zejména XML databáze [Po04], dotazovací jazyky pro XML [ToK04] a komprese XML dat [ToV04].
2 Formát XML XML je formát pro reprezentaci a přenos obecných dokumentů [W3C04a, XML04a, XML04b, XML04c]. Při návrhu XML se autoři řídili následujícími principy: • • • •
XML musí být použitelné v rámci Internetu, XML by mělo podporovat širokou škálu aplikací, XML musí být kompatibilní s SGML, Musí být snadné vytvářet programy, které manipulují s dokumenty v XML,
• Množství variant XML by mělo být minimální (nejlépe žádné) a • XML dokumenty by měly být čitelné a pochopitelné. Na základě těchto principů navrhli definici XML, která zahrnuje dvě části: • definice co to je XML dokument, • definice programů, které zpracovávají XML dokumenty (XML procesor). XML procesor je modul, který umí číst XML dokumenty a zpřístupňuje entity aplikacím. XML procesor kontroluje, zda je dokument dobře vytvořen – zda odpovídá pravidlům zápisu XML dokumentů. Porušení tohoto omezení představuje fatální chybu, kterou musí XML procesor detekovat a hlásit aplikaci. XML procesor může být validující - pak umí kontrolovat, zda vstupní XML dokument je správný vzhledem k zadané specifikaci struktury XML dokumentu.
2.1 XML dokument XML dokument se fyzicky skládá ze sady entit (objektů). Z hlediska XML může každá entita obsahovat buď rozpoznatelná data nebo nerozpoznatelná data. Rozpoznatelná data pro XML jsou sestavena ze znaků a představují buď znaková data nebo značky (markups). Značky popisují logickou strukturu dokumentu a jeho rozložení (layout). Jedna entita může odkazovat na entitu jinou. Dokument začíná entitou nazývanou kořen (root entity – objekt syntaktické třídy document). Logicky se XML dokument skládá z deklarací, elementů, komentářů a instrukcí pro zpracování jinou aplikací. Logické elementy jsou v dokumentu vyznačeny značkami. XML poskytuje mechanizmy na definici omezení logické struktury a rozložení dokumentu (DTD – Document Type Definition, nebo nověji a přesněji XML Schema). Tyto možnosti budou podrobně probírány v jiném příspěvku ([Ml04]). XML dokument je dobře vytvořen (well-formed), pokud všechny rozpoznatelné entity v dokumentu jsou správně vytvořeny a navíc, všechny rozpoznatelné entity, na které existují v dokumentu odkazy, jsou rovněž dobře vytvořeny. Dobře vytvořené elementy musí být správně uzávorkovány, závorky se nesmí křížit. Každá dvojice závorek musí být korektně spárována v rámci elementu a tyto dvojice musí být dobře vnořeny do sebe. Z toho plyne, že dobře vytvořený XML dokument má stromovou strukturu. Uvažme jako příklad jednoduchou faxovou zprávu:
<jmeno>Jan Amos33333 <jmeno>Karel Hynek66666 …
Elementy mohou mít atributy, kterými jsou blíže charakterizovány. Atributy se vkládají do otevírací závorky v čele elementu ve formě dvojice: klíčové slovo=“hodnota“. Hodnoty atributů musí být vždy uzavřeny v uvozovkách nebo apostrofech. Stejnou faxovou zprávu lze s pomocí atributů vyjádřit následovně:
…
Každý dobře vytvořený XML dokument může být navíc správný (valid), pokud splňuje další omezení správnosti (validity constraints). Ta jsou určena specifikací typu dokumentu, pomocí DTD nebo pomocí XML schématu vyjádřeném např. v jazyce XML Schema. Ke specifikaci každého elementu je možno připojit podmínky pro dobře vytvořený element (WFC – Well-Formedness Condition) a podmínky pro správný XML dokument (VC Validation Condition).
2.2 Prolog XML dokumentu Každý správný XML dokument začíná prologem, za ním následuje kořen dokumentu a na konec dokumentu může být připojena sada komentářů a instrukcí pro jiné aplikace. Prologem se stanoví verze XML a případně požadavky na strukturu dokumentu (DTD nebo XML schéma). Každý XML dokument obsahuje jeden či více elementů. Vždy existuje právě jeden element nazývaný kořen (root), jehož žádná část není obsažena v žádném jiném elementu. XML dokument může a měl by začínat deklarací verze XML, jinak je sice dobře vytvořen, ale není správný. Jinými slovy, každý správný XML dokument obsahuje prolog s deklarací verze XML. Deklarace verze dokumentu má tvar:
Součástí prologu je také specifikace typu XML dokumentu. Specifikace typu představuje odkaz na jakousi gramatiku třídy dokumentů, která se zapisuje buď jako definice typu dokumentu (DTD) nebo XML schéma dokumentu v jazyce XML Schema. Specifikace typu XML dokumentu může odkazovat na externí entitu, která obsahuje deklaraci značek, nebo může tuto deklaraci obsahovat přímo XML dokument, nebo obojí. Skutečná gramatika je tvořena spojením těchto deklarací, interní mají v případě kolize přednost před externími. Příklady specifikace typu dokumentu • Dokument s externím DTD: <pozdrav>Hello, world!
• Dokument v XHTML s definicí stanovenou externím DTD: <meta http-equiv="content-type" content="text/html; charset=ISO-8859-2"/>
Zprava Moje zpráva
• Dokument s lokálním DTD: ]> <pozdrav>Hello, world!
• Dokument s definicí stanovenou XML schématem:
<pozdrav xsi:noNamespaceSchemaLocation= "http://www.example.com/schemas/pozdrav.xsd" xmlns="" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> Hello, world!
2.3 Obsah XML dokumentu XML dokument se logicky skládá z elementů, komentářů a dat pro jiné aplikace (instrukcí pro zpracování). Základním prvkem dokumentu je element. Každý XML dokument obsahuje jeden nebo více elementů, omezených závorkami (start-tag a end-tag), nebo případně prázdných (označených tzv. empty-element tag). Každý element má typ identifikovaný jménem (generickým identifikátorem) a může mít sadu atributů. Každý atribut má jméno a hodnotu. Příklad
text tvořící obsah elementu osoba
Obsahem elementu může být libovolná posloupnost znakových dat, jiných vnořených elementů, referencí (odkazů) na jiné objekty, datových sekcí (CDATA), instrukcí pro zpracování jinou aplikací, nebo komentářů. Jednotlivé složky jsou popsány dále. Prázdný element Prázdné elementy slouží obvykle pro vyznačení místa, kam se později doplní nějaký element, nebo pro logické vyznačení místa v dokumentu. Prázdný element může mít atributy (to může být např. jeho smyslem). Různé formy ukazují následující příklady:
Komentáře Komentáře se v XML dokumentu mohou vyskytnout kdekoliv mimo ostatní značky. XMLprocesor může umožnit aplikaci číst text komentářů (obsah komentářů). V komentáři se nesmí vyskytovat řetězec "--" (double-hyphen), neboť ten se používá v komentářových závorkách podle syntaxe:
Instrukce pro jinou aplikaci Definice XML dokumentu umožňuje, aby dokument obsahoval instrukce a data pro jinou aplikaci. Takové sekci se říká „Processing Instructions“ (PI). Instrukce obsahují návěští (PITarget), kterým je identifikována aplikace, pro kterou jsou instrukce určeny (nesmí to být XML). Obsah sekce instrukcí není chápán jako součást dokumentu, obsah musí být pouze předán ke zpracování dané aplikaci.
Sekce CDATA Sekce typu CDATA slouží k označení bloků textu, který by jinak mohl být považován za značku. Uvedeme-li v dokumentu text: <pozdrav>Hello, world!
bude chápán jako element typu „pozdrav“ s obsahem „Hello, world!“. Chceme-li, aby závorky „pozdrav“ byly součástí textu elementu, musíme použít konstrukci: Hello, world!]]>
2.4 DTD – specifikace struktury dokumentu Jak jsme se již několikrát zmínili, lze pro XML dokumenty předepsat jejich požadovanou strukturu. Zde probereme specifikaci struktury pomocí DTD. Základem DTD jsou deklarace typů elementů – ty specifikují, jaké elementy může XML dokument obsahovat a jak se mohou skládat a vnořovat. Deklarace typu elementu Deklarace typu elementu zavádí jméno elementu a specifikuje jeho možný obsah. Element může být prázdný (EMPTY):
Element může mít libovolný obsah (ANY):
Element může obsahovat určitá data (znaky v implicitním, nebo předepsaném kódu):
Obsah elementu může být specifikován regulárním výrazem, kde se znakem: • • • • •
? + * | ,
vyjadřuje nepovinnost složky, vyjadřuje možnost opakování složky 1x a více, vyjadřuje možnost libovolného opakování složky, vyjadřuje možnost selekce možností a vyjadřuje požadavek na sekvenční uspořádání složek.
Následující deklarace elementu typu „dopis“ říká, že každý element tohoto typu musí obsahovat nejméně jeden vnořený element typu „adresa“, pak následují povinné elementy „osloveni“, „text“ a „podpis“ a to v tomto pořadí. Nakonec může být nepovinně uveden element typu „poznamka“.
Pokud chceme připustit, aby element typu „p“ obsahoval libovolnou posloupnost znaků a elementů typu „emph“, zapíšeme to následující deklarací.
Deklarace seznamu atributů elementu Deklarace typu elementu zavádí jméno elementu. Atributy elementu jsou zavedeny deklarací seznamu atributů. Při deklaraci atributů lze o každém atributu stanovit zda je povinný (#REQUIRED), či nepovinný. Dále lze požadovat unikátnost atributu (ID), lze nastavit atribut jako konstantní (#FIXED). Lze určit výčet možných hodnot a případnou implicitní hodnotu.
Pokud specifikujeme jako typ atributu typ ID, musí být hodnota tohoto atributu jednoznačná v rámci jednoho dokumentu – jedná se o jakýsi primární klíč na úrovni dokumentu. Pouze jediný atribut v rámci elementu může být typu ID. Odkazy na atribut typu ID lze specifikovat jako atribut typu IDREF, příp. IDREFS (seznam odkazů oddělených mezerou) – jakýsi cizí klíč v rámci dokumentu.
Ve výše uvedené specifikaci má atribut „sin“ význam „social insurance number“, které by mělo být jednoznačné a lze jej použít pro odkazy z jiných elementů typu „osoba“ téhož dokumentu pomocí atributu „druh“. Pokud by „druhů“ mohlo být více, použila by se specifikace typu IDREFS. Deklarace entity Entity využívá XML podobně jako symbolické konstanty. Deklarací entity se stanoví nahrazující text pro entitu. Často se toho využívá pro speciální znaky, které nejsou součástí použitého kódu.
Reference Reference představuje odkaz na jinou entitu nebo parametr dokumentu. Součástí reference mohou být podmínky, za kterých je reference dobře vytvořena (WFC), nebo správná (VC). Lze tak například zakázat rekurzivní odkazy. Reference vždy končí znakem ‘;’ a začíná buď znakem ‘&’ (reference na entitu), nebo znakem ‘%’ (reference na parameter). Mezi těmito omezovači se uvede jméno entity nebo parametru. ' %size; %version; [ WFC: No Recursion ]
Parametry Parametry jsou podobné entitám. V deklaraci parametru (parametrické entity) je jméno parametru předznačeno znakem ‘%’.
%ISOLat2;
Příklad XML dokumentu ]>
<jmeno>Jan<prijmeni>Amos <jmeno>Karel<prijmeni>Hynek Ahoj! Pozdrav z říše divů! <podpis><jmeno>Alenka P.S.: <dodatek>Napište mi!
3 Datový model XML dokumentů Při zpracování XML dokumentů je třeba studovat řadu otázek. Patří sem zejména otázka, jak XML dokumenty ukládat. Bylo definováno několik datových modelů pro reprezentaci XML dokumentů (např. [W3C03b, SAX02]). Tyto datové modely nejsou zamýšleny jako předpis pro implementaci, ale slouží pro účely specifikace. Jsou definovány pro dobře vytvořené XML dokumenty, které mohou být správné (konformní) vzhledem k DTD nebo XML schématu. Existují dva základní přístupy ke zpracování XML dokumentů. Prvý přístup spočívá v definici stromové reprezentace XML dokumentu v paměti (příp. virtuální). Vstupní analyzátor přečte celý XML dokument, uloží jej do paměti ve formě stromu a aplikaci poskytuje sadu funkcí pro traverzování, či modifikaci této stromové struktury. Uvažme jako příklad dokument v HTML [W3C99a], kde každý správný dokument obsahuje element „body“ – tělo HTML stránky. Po načtení a analýze dokumentu „doc“ můžeme „tělo“ získat: // načteme posloupnost potomků, které se jmenují "body" var potomci = doc.getElementsByTagName("body"); // protože HTML dokument má právě jedno tělo, vybereme prvního z nich var telo = potomci.item(0); // a můžeme s ním dále pracovat telo.style.color = "black";
Jiný přístup ke zpracování XML dokumentů je událostmi řízený model. Pokud zpracováváme veliký XML dokument, ale zajímá nás pouze jeho část, bylo by zbytečné celý dokument ukládat v paměti. Místo toho lze vstup XML dokumentu považovat za posloupnost událostí, které musí aplikace zpracovat. Jako příklad takového rozhranní lze uvést model SAX (Simple API for XML [SAX02]). Uvažme např. následující jednoduchý XML dokument:
<pozdrav barva="blue">Hello, world!
Událostmi řízená rozhranní převede tento dokument na posloupnost událostí: start document start element: zprava start element: pozdrav characters: Hello, world! end element: pozdrav start attribute: barva characters: blue end attribute: barva end element: zprava end document
Tyto události pak musí zpracovat aplikace. Je vhodné poznamenat, že pomocí událostmi řízeného rozhranní lze zkonstruovat stromovou reprezentaci dokumentu a naopak – strom lze procházet pomocí událostí. Zde uvedeme datový model podle specifikace [W3C03b], tzv. DOM model. Pro účely práce se sadami XML dokumentů podporuje též reprezentaci kolekcí XML dokumentů a kolekcí hodnot. XML dokument je modelován jako strom. Uzly tohoto stromu mohou být některého z následujících typů: dokument, element, atribut, text, jmenný prostor, instrukce pro zpracování a komentář. Každý strom má právě jeden kořen, pokud je to uzel typu dokument, pak mluvíme o XML dokumentu, pokud je jiného typu, mluvíme o fragmentu XML dokumentu. Definice datového modelu zavádí nový typ „posloupnost (sequence)“. Posloupnost je uspořádaná kolekce položek (včetně prázdné posloupnosti). Položkou (item) v posloupnosti může být uzel nebo atomická hodnota. Kolekce dokumentů je reprezentována posloupností uzlů typu dokument. Ve starších verzích se pracovalo s množinami položek („node-sets“), ale novější verze pracují s posloupnostmi. Dovoluje to bohatší možnosti a k množině se dá vždy přejít. Není možné zjišťovat identitu dvou posloupností – je ale možné rozhodnout, zda obsahují stejné položky. Porovnání se děje postupným srovnáním prvků posloupností. Posloupnost obsahující jedinou položku se od této položky nerozlišuje, považuje za totéž. Posloupnost nemůže obsahovat jinou posloupnost – položkou může být pouze uzel nebo atomická hodnota. Při manipulaci s více posloupnostmi se tyto spojují tak, že výsledkem je opět jediná posloupnost. Atomické hodnoty představují hodnoty jednoduchých primitivních typů, nebo typů z nich odvozených restrikcí. Primitivní typy jsou např. logické hodnoty (boolean), celá čísla (decimal), desetiná čísla (float, double), řetězce znaků (string), časové údaje (date, time, duration) a různé speciality (untypedAny, untypedAtomic, anyAtomicType). Každá atomická hodnota se dá převést na řetězec. Podrobněji viz definice jazyka XML Schema v příspěvku [Ml04]. Uzly XML stromu jsou propojeny vazbami, které vyjadřují jejich hierarchii a strukturu. Každý uzel XML stromu je dosažitelný z kořene. Uzly různých typů jsou propojovány v jiných rovinách (používá se termín osa – axis). Propojení reprezentující hierarchii elementů dokumentu je vyjádřeno vztahy v ose potomek-předchůdce. Atributy elementu jsou k němu připojeny v ose atributů. XML strom představuje uzlově ohodnocený, orientovaný, acyklický graf. Každý uzel stromu je unikátní – má svou unikátní identitu (která ovšem nesouvisí s jednoznačnou identitou v rámci XML dokumentu předepsanou atributy ID/IDREFS).
Každý XML strom má přesně definováno pořadí uzlů, které obsahuje (document order). Toto uspořádání je v rámci jednoho zpracování stromu úplné, byť některé části mohou být implementačně závislé – např. pořadí atributů elementu není dáno normou, ale implementací. Pořadí uzlů je dáno prohledáváním do hloubky, in-order. Kořen stromu je vždy prvý uzel v pořadí uzlů. Pořadí sourozenců ve stromě je dáno jejich pořadím v reprezentovaném XML dokumentu. Uzly typu „jmenný prostor (namespace)“ bezprostředně následují element, ke kterému se vztahují. Jejich relativní pořadí je implementačně závislé. Uzly typu „atribut“ jsou zařazeny za případné uzly typu „jmenný prostor“, jejich relativní pořadí je opět implementačně závislé. Pro traverzování XML stromu jsou k dispozici předefinované přístupové funkce, tzv. „accessors“. V přehledu je budeme uvádět včetně jmenného prostoru dm:http://www.w3.org/TR/xpath-datamodel. Funkce dm:node-kind
Služba, kterou zajišťuje služba, která zjišťuje druh uzlu
dm: base-uri dm: node-name dm: type dm: typed-value
vrací URI vrací jméno uzlu vrací jméno typu uzlu vrací typovanou hodnotu
dm: string-value dm: parent dm: children dm: attributes dm: namespaces
vrací řetězec vrací rodiče vrací potomky vrací atributy vrací jm.prostory
dm: nilled
vrací příznak tzv. „nilled“ elementu
Návratová hodnota vrací jednu z hodnot: “document”, “element”, “attribute”, “namespace“, “processing-instruction”, “comment”, nebo “text” vrací posloupnost URI pro daný prvek vrací posloupnost jmen pro daný prvek vrací posloupnost jmen typů pro daný prvek vrací posloupnost atomických hodnot pro daný prvek vrací hodnotu prvku převedenou na řetězec vrací rodiče prvku jako posloupnost uzlů vrací potomky prvku jako posloupnost uzlů vrací atributy prvku jako posloupnost uzlů vrací jmenné prostory prvku jako posloupnost uzlů vrací logickou hodnotu true, pokud je aplikována na element, který má prázdný obsah, vrací prázdnou posloupnost, pokud je aplikována na jiný uzel, než element
Mimo tyto základní traverzovací funkce je k dispozici celá sada různých metod, např. uzel typu „element“ může poskytovat (mimo jiné) metody (fragment v IDL): boolean hasAttribute(in DOMString name); -- test na existenci atributu DOMString getAttribute(in DOMString name); -- získání hodnoty atributu void setAttribute(in DOMString name, in DOMString value) raises(DOMException); -- nastavení hodnoty atributu void removeAttribute(in DOMString name) raises(DOMException); -- zrušení atributu Attr getAttributeNode(in DOMString name); -- vrátí uzel atributu NodeList getElementsByTagName(in DOMString name); -- vrátí seznam elementů daného jména
Specifikace W3C dokonce doporučuje interface modulů pro traverzování, např. pro procházení všech uzlů posloupnosti: interface NodeIterator { Node nextNode() raises(DOMException); Node previousNode()raises(DOMException);
}; NodeIterator iter= ((DocumentTraversal)document).createNodeIterator( root, NodeFilter.SHOW_ELEMENT, null); while (Node n = iter.nextNode()) printMe(n);
Podobně pro traverzování stromu: interface TreeWalker { Node parentNode(); Node firstChild(); Node lastChild(); Node previousSibling(); Node nextSibling(); Node previousNode(); Node nextNode(); }; processMe(Node n) { nodeStartActions(n); for (Node child=n.firstChild(); child != null; child=child.nextSibling()) { processMe(child); } nodeEndActions(n); }
Uvažme jednoduchý dokument:
<pozdrav barva="blue">Hello, world!
Jeho XML strom by mohl vypadat následovně: zprava: document
pozdrav: element
barva= “blue“: attribut
“Hello, world! “: text Serializované vyjádření XML stromu lze zapsat pomocí výsledků traverzovacích funkcí: // Document node D1 dm:node-kind(D1) = "document" dm:string-value(D1) = "Hello, world!" dm:children(D1) = ([E1]) // Element node E1 dm:node-kind(E1) =
"element"
dm:node-name(E1) = xs:QName("", "pozdrav") dm:string-value(E1) = "Hello, world!" dm:typed-value(E1) = "Hello, world!" dm:type(E1) = xs:anyType dm:parent(E1) = ([D1]) dm:children(E1) = () dm:attributes(E1) = ([A1]) // Attribute node A1 dm:node-kind(A1) = "attribute" dm:node-name(A1) = xs:QName("", "barva") dm:string-value(A1) = "blue" dm:typed-value(A1) = "blue" dm:type(A1) = xs:string dm:parent(A1) = ([E1]) / Text node T1 dm:node-kind(T1) = "text" dm:string-value(T1) = "Hello, world!" dm:typed-value(T1) = xs:anySimpleType("Hello, world!") dm:type(T1) = xs:anySimpleType dm:parent(T1) = ([E1])
4 Jazyk XPath Jak bylo ukázáno v předchozí sekci, lze XML dokumenty reprezentovat pomocí XML stromů. Při práci s XML dokumenty potřebujeme mít nějaký nástroj pro označování částí XML dokumentů. Jinými slovy, potřebujeme mít nástroj, který de facto popisuje cestu od kořene stromu k danému prvku. Konsorcium W3C vytvořilo návrh specializovaného jazyka XPath [W3C99c], který slouží pro tento účel. Jazyk XPath bývá použit jako součást jiných jazyků a formátů, např. XQuery, XSLT apod. Základním konstruktem jazyka XPath je výraz (location path expression). Výraz jazyka XPath je tvořen posloupností kroků (location steps), které jsou odděleny lomítkem „/“. Pokud výraz začíná lomítkem, jedná se o absolutní cestu, jinak o cestu relativní. Krok-1 / Krok-2 / … / Krok-n
Pokud je zapotřebí vyznačit explicitně dokument, pro který se má výraz vyhodnotit, využívá se prefixu „document“: document(…)/Krok-1 / Krok-2 / … / Krok-n
Kroky výrazu vyznačují postup XML stromem. Každý krok může být kvalifikován osou, po které se má postupovat. Pokud kvalifikaci neuvedeme, používá se osa „child“. Obecně lze pro označení osy použít následující kvalifikátory: „ancestor“, „ancestor-or-self“, „atribute“, „child“, „descendent“, „descendant-or-self“, „following“, „following-sibling“, „namespace“, „parent“, „preceding“, „preceding-sibling“, nebo „self“. Osa-1::Krok-1 / Osa-2::Krok-2 / … / Osa-n::Krok-n
Výrazy XPath slouží pro označení částí XML dokumentu. Sémantickým významem výrazu v jazyce XPath je posloupnost uzlů nebo atomických hodnot. Význam výrazu závisí na tzv. kontextu – kontextem pro celý výraz je vstupní XML dokument (nebo kolekce dokumentů), pro který se výraz vyhodnocuje. Výraz se vyhodnocuje vždy zleva doprava po jednotlivých krocích, ze kterých se skládá. Význam kroku v daném kontextu je opět posloupnost uzlů nebo atomických hodnot. Kontext pro prvý krok je vstupní dokument,
výsledek prvého kroku tvoří kontext pro druhý krok atd. Význam výrazu XPath je posloupnost uzlů nebo atomických hodnot, která je významem posledního kroku. Uvažme jako příklad vstupu XML dokument obsahující údaje o universitě, který bude uložen v souboru „universita.xml“
<Student TypStudia="MSc" username="xnovak10"> <jmeno>Josef Novák 1.1.1980 Praha 4, Nová 45 3 <Student TypStudia="PhD" username="xpolak11"> <jmeno>Pavel Polák 1.1.1980 Praha 3
a bude správný vzhledem k DTD „universita.dtd“.
Pak následující výraz XPath: document(¨universita.xml¨)/Universita/Fakulta/Student/jmeno
vrátí posloupnost dvou uzlů typu element odpovídající jménům obou studentů. Potřebujeme-li vybrat druhého studenta fakulty s identifikátorem „F3“, použijeme výraz: id("F3")/child::Student[position()=2]
Zde bylo použito jméno osy „child“, kterou jsme zdůraznili směr navigace. Jsou definovány zkratky, kterými se zápis zjednodušuje. Např. výraz: //Student[@rocnik = "3"]
označuje všechny studenty, kteří mají atribut „rocnik“ s hodnotou 3. Ve výrazech je možno využívat předdefinované, nebo i uživatelsky definované funkce. XPath je funkcionální jazyk v tom smyslu, že výrazy mohou být vnořeny do jiných výrazů (nemají vedlejší efekty). XPath
rozlišuje malá a velká písmena, je silně typovaný (každý výraz má přesně definován typ, složené výrazy vyžadují komponenty správných typů).
5 Transformační jazyk XSL XML dokumenty je třeba prezentovat v různých formátech. Konsorcium W3C vytvořilo návrh specializovaného jazyka XSL (eXtensible Stylesheet Language [W3C99b,W3C01b]), který byl původně zamýšlen jako jazyk určený pro popis ”style-sheets”- formátované tištěné verze XML dokumentů. Obecně však je XSL nástrojem pro popis transformací XML dokumentů, lze jej tedy využít pro řadu jiných účelů. Např. jej můžeme považovat za dotazovací jazyk, který pro daný transformační předpis a vstupní dokument vrátí výstupní dokument – výsledek dotazu.
• •
Definice XSL má dvě části: jazyk pro popis transformací XML dokumentů (XSLT), XML slovník popisující sémantiku formátování (výstupu).
Dokument v jazyce XSLT (XSL stylesheet) specifikuje transformaci třídy XML dokumentů na dokumenty jiné. Výstupem mohou být opět XML dokumenty, nebo stránky v HTML, příp. prostý text. Prezentace XML pomocí XSL Libovolný XML dokument jisté třídy (tj. konformní s DTD nebo XML schématem) lze prezentovat pomocí XSL. Vytvoříme předpis v jazyce XSLT, který bude obsahovat pravidla pro prezentaci. Proces prezentace má dva kroky: 1. zdrojový XML dokument (source tree) je podle pravidel transformován na výsledný document (result tree), 2. výsledný dokument je interpretován a výsledkem je formátovaný výstup (na obrazovce, papíru, atd.).
XML dokument XSL procesor
Formátovaný výstup
XSL stylesheet
Formát XSL dokumentu XSL dokument je XML dokument. Skládá se ze sady pravidel (také se jim říká šablony), která popisují transformaci vstupního dokumentu. Pravidla obsahují vzorek (pattern) a akci (template). Vzorek se porovnává se zdrojovým dokumentem, při srovnání se modifikuje akce pravidla (přizpůsobí se konkrétnímu srovnání) a aplikuje se na výsledný strom (zdrojový a výsledný strom jsou dva různé dokumenty). Struktura výsledného dokumentu může být
zcela jiná, než struktura zdrojového dokumentu (lze přidávat elementy, přeuspořádat pořadí, opakovat atd.). Protože je XSL dokument správně vytvořený XML dokument, musí být uzavřen v závorkách (používá se dvojice <xsl:stylesheet> a ) a všechny ostatní závorky musí být správně spárovány. Specifikace XSL plně využívá tzv. prostorů jmen (name spaces). Pro seznámení s XSL není nutno zcela podrobně porozumět tomuto mechanismu, postačí nám jednoduchý příklad. Podrobný popis lze nalézt na stránkách W3C. Všechny dokumenty odpovídající specifikaci XSL jsou vloženy do kořene XML dokumentu (root element): <xsl:stylesheet> …………
Příklad <xsl:stylesheet xmlns:xsl="http//www.w3.org/1999/XSL/Transform" xmlns:fo="http//www.w3.org/1999/XSL/Format" result-ns="fo"> ……………………
Kořen dokumentu má v tomto případě atributy: xmlns:xsl (prostor jmen XSL dokumentu jako XML dokumentu), xmlns:fo (formátovací slovník), a result-ns= ”fo” (výstupní prostor jmen). Prvý atribut je povinný a jeho hodnota musí být: xmlns:xsl="http//www.w3.org/1999/XSL/Transform"
Tento atribut slouží pro procesor XSL, který tak pozná, že všechny elementy s prefixem ‘xsl:’ mají být interpretovány dle specifikace XSL (jsou v prostoru ‘xsl’). Druhý atribut je teoreticky volitelný, ale ve skutečnosti bývá většinou uveden v naznačeném tvaru. Říká XSL procesoru, že elementy s prefixem ‘fo:’ (zkratka pro flow objects, nebo formatted objects) jsou v prostoru ‘fo’, a formátování využívá formátovací slovník dle specifikace XSL. Narazíli pak procesor na
, řídí se syntaxí specifikovanou v prostoru ‘fo’. Je samozřejmě možné používat jiný slovník, je pak ale třeba přesvědčit tvůrce aplikací, aby tento formát respektovali. Třetí atribut result-ns=”fo” říká XSL procesoru, že konstruovaný výstupní strom (result tree) používá slovník ‘fo’. Pravidla XSL dokumentu Pravidla XSL dokumentu popisují přepis vstupního dokumentu na výstupní. Každé pravidlo obsahuje vzorek a akci. Vzorek pravidla slouží pro selekci uzlu (elementu) vstupního stromu. Selekci je možno předepsat podle: jména elementu, předchůdce elementu, ID elementu, ”wildcards” (lze využít zástupné znaky), atributů elementu, relativní pozice elementu ve stromě, nebo unikátnosti elementu. Akce pravidla obsahují: elementy konstruovaného (formátovaného) objektu, např. vytvoří ve formátovaném objektu blok, atributy formátovaného objektu, např. indikuje, že ve výstupním objektu má být použito písmo velikosti 16 bodů, způsob zpracování (ve formě prázdného elementu), např. způsobí, že XSL procesor zpracuje v tomto místě všechny potomky. Procesor XSL prochází vstupní dokument (vstupní strom) a pokouší se hledat vzorky pravidel XSL dokumentu. Pokud se podaří nalézt shodu, aplikuje akci pravidla na výstupní
dokument (výstupní strom). Pokud je aplikovatelných pravidel více, lze stanovit pořadí při výběru pravidel. Pravidla mají následující formát: <xsl:stylesheet> <xsl:template... ...
Příklad pravidla XSL <xsl:stylesheet> <xsl:template match= ”pozdrav”>
Příklad zpracování dle tohoto pravidla vstup: <pozdrav>Hello XSL!
výstup: Hello XSL!
5.1 Zpracování XML dokumentu pomocí XSL Pokusme se jako příklad napsat popis transformace, která z databáze studentů uvedené dříve (soubor universita.xml) vybere určitého studenta a vytvoří XML dokument, který nese informaci o tom, že daný student je studentem příslušné fakulty (viz [Ku01]). <xsl:stylesheet version="1.0" xmlns:xsl=http://www.w3.org/1999/XSL/Transform <xsl:output method="xml" indent="yes"/> <xsl:param name="id" select="'xnovak10'"/> <xsl:param name="fak" select="'F3'"/> <xsl:template match="Fakulta"> <xsl:if test="./@idFakulty=$fak"> <xsl:apply-templates/> <xsl:template match="Student"> <xsl:if test="@username = $id"> <xsl:processing-instruction name= "cocoon-process">type="xslt" <xsl:processing-instruction name=
"xml-stylesheet">href="pos2-HTML.xsl" type="text/xsl" <xsl:variable name="typ"> <xsl:choose> <xsl:when test="./@TypStudia = 'BSc'">bakalář <xsl:when test="./@TypStudia = 'MSc'">inženýr <xsl:when test="./@TypStudia = 'PhD'">doktorand <xsl:otherwise/> <xsl:value-of select="./../@nazev"/> <paragraph> Děkan fakulty <xsl:value-of select="./../@nazev"/> potvrzuje, že
<jmeno><xsl:value-of select="./jmeno"/> , narozen(á) <xsl:value-of select="./narozeni"/>
bydliště: <xsl:value-of select="./adresa"/> působí na naší fakultě jako <xsl:value-of select="$typ"/>
ve <xsl:value-of select="./rocnik"/> ročníku.
Příklad výstupu Aplikujeme-li tento předpis pro transformaci na dokument „universita.xml“, bude výstupem opět XML dokument (ale správný vzhledem k jinému DTD), který obsahuje potřebné informace o certifikátu, ale zatím nenaformátované.
<paragraph> Děkan fakulty elektrotechnická potvrzuje, že
<jmeno>Josef Novák , narozen(á) 1.1.1980
bydliště: Praha 4, Nová 45 působí na naší fakultě jako inženýr
ve 3 ročníku.
Příklad převodu do HTML Následující příklad ukazuje předpis pro převod dokumentu v XML vytvořeného v předchozím odstavci do HTML pomocí XSLT. <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output method="html"/> <xsl:template match="/certificate"> <xsl:processing-instruction name= "cocoon-format">type="text/html" Potvrzení o studiu <xsl:apply-templates/>
The Dean of
<xsl:template match="header"> České vysoké učení technické |
Fakulta <xsl:value-of select="Fakulta"/> |
Datum: <xsl:value-of select="date"/> |
POTVRZENÍ
<xsl:template match="Fakulta|jmeno|narozeni|adresa|TypStudia|rocnik"> <xsl:value-of select="."/> <xsl:template match="paragraph"> <xsl:apply-templates/>
<xsl:template match="row"> <xsl:apply-templates/> <xsl:template match="text"> <xsl:value-of select="."/>
Výstupem pak bude dokument v XHTML: <META http-equiv="Content-Type" content="text/html; charset=UTF-8"> The Certificate about Study České vysoké učení technické |
Fakulta elektrotechnická | Datum: 15.8.2001 |
POTVRZENÍ
Děkan fakulty elektrotechnická potvrzuje, že
Josef Novák narozen(á) 1.1.1980 bydliště: Praha 4, Nová 45 působí na naší fakultě jako inženýr ve 3 ročníku.
Vytvořený certifikát lze ale prezentovat i v jiných formátech. Jako ukázku uvažme jen fragment XLST kódu pro převod do formátu FO (PDF), který je součástí definice XSL. <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fo="http://www.w3.org/1999/XSL/Format" > <xsl:output method="xml" indent="yes"/> <xsl:template match="/certificate"> <xsl:processing-instruction name="cocoon-format">type="text/xslfo"
<xsl:apply-templates/> České vysoké učení technické ...
6 Protokol SOAP Konsorcium W3C v současné době podporuje řadu dalších formátů, které z XML vycházejí – tzv. aplikace XML. Jednou takovou aplikací je i standard pro tzv. „webové služby“ – služby poskytované prostřednictvím sítě. Jako příklad takové služby může posloužit služba pro zjištění aktuálního kurzu akcie ve vzdáleném místě. Pokud mají být takové služby nezávislé na platformě a být dostupné zcela globálně, je výhodné využít při jejich volání reprezentaci ve formátu XML. Je to tedy rozšíření XML z datové oblasti na volání funkcí. Požadavek na službu zakódujeme do XML a přeneseme pomocí protokolu HTTP na cílový stroj. Tam je požadavek rozkódován, obsloužen a získané výsledky opět přeneseny zpět ve formátu XML. Volání služeb ve vzdáleném místě lze formulovat a přenášet pomocí protokolu, který je založen na formátu XML. Jedním z takových je formát SOAP (Simple Object Access Protocol [W3C03a, Ni01]), který slouží pro obecné vyvolávání metod vzdálených objektů. Aby ale klient věděl, jak službu vzdáleného objektu vyvolat, musí znát její „interface“ funkční profil. Pro jejich zápis byl definován standard WSDL (Web Services Description Language [W3C04b]). Z popisu služby ve WSDL lze automaticky vygenerovat kód, kterým tuto službu zavoláme (ve formátu SOAP), i kostru programové obsluhy této služby. Poslední související problém je, jak zjistit, které služby se v síti nabízí. K tomu by měl posloužit univerzální registr obsahující seznam a popis dostupných webových služeb, tzv. UDDI (Universal Description, Discovery and Integration [OASIS02]). V takovém registru by mělo být možné službu vyhledat, podle jejího popisu ve WSDL zformulovat zprávu ve formátu SOAP a nechat se vzdáleným poskytovatelem obsloužit.
Požadavek na službu je třeba zabalit do „obálky“. Poslouží zde protokol SOAP, což je jednoduchý protokol, který definuje uniformní způsob přenášení dat v XML. Rovněž definuje, jakým způsobem se má pomocí HTTP provést vyvolání vzdálené procedury (RPC Remote Procedure Call). SOAP vychází z přesvědčení, že ať je aktuální realizace procedury služby jakkoliv sofistikovaná, její vyvolání přes XML zvyšuje operativnost v rámci sítě. Hlavním elementem dokumentu ve formátu SOAP je obálka (SOAP-Envelope, viz obrázek). Ta může obsahovat hlavičku (Header) a musí obsahovat tělo (Body). Dále může obsahovat informace pro zpracování výjimek (Fault). Např. požadavek na provedení součtu dvou hodnot může vypadat následovně (do obálky je třeba vložit i odkazy na XML schémata zabudovaných typů, které používáme): <SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"> <SOAP-ENV:Body SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xmlns:wn1="http://www.w3.org/2000/10/XMLSchemas" xmlns:wn0="http://www.w3.org/2001/XMLSchemas" xmlns:xsi="http://www.w3.org/2001/XMLSchemas-instance"> <nsp:Soucet xmlns:nsp="urn:x-kosek:services:Soucet"> <par0 xsi:type="wn0:int">2 <par1 xsi:type="wn0:int">5
Tato zpráva je zaslána na server. Tam musí být obsluha, která požadavek dekóduje a vykoná. Poté je výsledek služby opět zabalen do „SOAP“ obálky a poslán zpět:
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"> <SOAP-ENV:Body SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xmlns:wn1="http://www.w3.org/2000/10/XMLSchemas" xmlns:wn0="http://www.w3.org/2001/XMLSchemas" xmlns:xsi="http://www.w3.org/2001/XMLSchemas-instance"> <nsp:Vysledek_souctu xmlns:nsp="urn:x-kosek:services:Soucet">
7
Výsledek je na straně klienta dekódován, jsou z něj extrahována data předána ke zpracování (např. metodě „println“ k vytištění).
7 Formát WSDL Jako poslední příklad aplikace formátu XML uvedeme jazyk WSDL (Web Services Description Language [W3C04b]). Dokument ve formátu WSDL představuje sadu definic zahrnutých do elementu „wsdl:definitions“. Zjednodušená gramatika pro tento element je znázorněna na obrázku na následující straně. Služby jsou definovány pomocí 4 základních elementů: message – abstraktní definice přenášených dat, skládá se z částí (parts), portType – představuje sadu abstraktních operací, které mají definován vstup, výstup a reakci na chyby, binding – popisuje konkrétní protokol pro navázání operace na složky operace popsané pomocí portType, service – odkazuje na uzel který službu realizuje a pomocí složek port odkazuje na způsob vazby (binding).
Příklad definice ve formátu WSDL Předpokládejme, že chceme vytvořit a použít jednoduchou webovou službu. Pro jednoduchost uvažme službu, která nevyžaduje žádné další pomocné komponenty. V [Ko02] je uveden příklad služby na sečtení dvou čísel. Popis této služby vyžaduje, abychom stanovili, že požadavek na vykonání této služby bude muset obsahovat 2 parametry této služby – označme je jako par0 a par1. Parametry jsou celá čísla: <wsdl:message name='Pozadavek_na_secteni'> <wsdl:part name='par0' type='xsd:int'/> <wsdl:part name='par1' type='xsd:int'/>
Získaný výsledný součet bude opět celé číslo: <wsdl:message name='Vysledek_souctu'> <wsdl:part name='vysledek' type='xsd:int'/>
V části označované „portType“ je nutno stanovit, jaká operace bude implementovat požadavek na službu „Soucet“. Služba „Soucet“ bude implementována pomocí operace „Sum“, které budou předány dva parametry par0 a par1 v tomto pořadí: <wsdl:portType name='Soucet'> <wsdl:operation name='Sum' parameterOrder='par0 par1'> <wsdl:input name='Soucet' message='tns:Pozadavek_na_soucet'/>
<wsdl:output name='Soucet' message='tns:Vysledek_souctu'/>
V části označené „Binding“ se stanoví, jakým způsobem bude požadavek transportován. Pro náš účel bude vyhovovat přenos typu „RPC“ – Remote Procedure Call, kde vstup a výstup bude zakódován jako XML elementy: <wsdl:binding name='SoucetSOAP' type='tns:Soucet'> <soap:binding transport='http://schemas.xmlsoap.org/soap/http' style='rpc'/> <wsdl:operation name='Soucet'> <soap:operation soapAction='' style='rpc'/> <wsdl:input name='Soucet'> <soap:body use='encoded' encodingStyle='http://schemas.xmlsoap.org/soap/encoding/' namespace='urn:x-kosek:services:Soucet'/> <wsdl:output name='Soucet'> <soap:body use='encoded' encodingStyle='http://schemas.xmlsoap.org/soap/encoding/' namespace='urn:x-kosek:services:Soucet'/>
Nakonec v části označené „Service“ stanovíme, který výpočetní uzel bude adresován a jaký vazební element bude použit: <wsdl:service name='Soucet'> <wsdl:port name='Sum' binding='tns:SoucetSOAP'> <soap:address location='http://localhost:6060/Soucet/'/>
Celý dokument ve formátu WSDL pak bude vypadat následovně: <wsdl:definitions name='Sum' targetNamespace='urn:x-kosek:services:Sum' xmlns:wsdl='http://schemas.xmlsoap.org/wsdl/' xmlns:xsd='http://www.w3.org/2001/XMLSchema' xmlns:tns='urn:x-kosek:services:Sum' xmlns:http='http://schemas.xmlsoap.org/wsdl/http/' xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' xmlns:mime='http://schemas.xmlsoap.org/wsdl/mime/' xmlns:soap='http://schemas.xmlsoap.org/wsdl/soap/' xmlns:SOAP-ENC='http://schemas.xmlsoap.org/soap/encoding/'> <wsdl:message name='Vysledek_souctu'> <wsdl:part name='vysledek' type='xsd:int'/> <wsdl:message name='Pozadavek_na_soucet'> <wsdl:part name='p0' type='xsd:int'/> <wsdl:part name='p1' type='xsd:int'/> <wsdl:portType name='Sum'> <wsdl:operation name='Sum' parameterOrder='p0 p1'> <wsdl:input name='Sum' message='tns:Pozadavek_na_soucet'/> <wsdl:output name='Sum' message='tns:Vysledek_souctu'/> <wsdl:binding name='SoucetSOAP' type='tns:Sum'>
<soap:binding transport='http://schemas.xmlsoap.org/soap/http' style='rpc'/> <wsdl:operation name='Sum'> <soap:operation soapAction='' style='rpc'/> <wsdl:input name='Sum'> <soap:body use='encoded' encodingStyle='http://schemas.xmlsoap.org/soap/encoding/' namespace='urn:x-kosek:services:Sum'/> <wsdl:output name='Sum'> <soap:body use='encoded' encodingStyle='http://schemas.xmlsoap.org/soap/encoding/' namespace='urn:x-kosek:services:Sum'/> <wsdl:service name='Soucet'> <wsdl:port name='Soucet' binding='tns:SoucetSOAP'> <soap:address location='http://localhost:6060/Sum/'/>
Webová služba v akci Uvažme, jak by tato webová služba mohla být realizována a využívána. Na straně serveru může být služba implementována následovně (Java): public class Sum { public int Sum(int x, int y) { return x + y; } }
Na straně klienta bude služba deklarována: package client.iface; public interface Sum { int Sum(int par0, int par1); }
Aplikace, která bude tuto službu využívat by mohla vypadat následovně: package client; import import import import import
client.iface.*; org.idoox.wasp.Context; org.idoox.wasp.MessageAttachment; org.idoox.webservice.client.WebService; org.idoox.webservice.client.WebServiceLookup;
public class SoucetKlient{ public static void main(String args[]) throws Exception { String host = "http://localhost:6060/Soucet/"; //nastavení služby lookup WebServiceLookup lookup = (WebServiceLookup)Context.getInstance ("org.idoox.webservice.client.WebServiceLookup"); //zjisteni instance Webové služby přes službu lookup Soucet service = (Soucet)lookup.lookup ("http://localhost:6060/Soucet/", Soucet.class,host);
//nakonec lze vyvolat metodu přes interface webové služby System.out.println(service.Soucet(2,5)); } }
Zajímavá je poslední řádka programu, kde voláme metodu „Soucet“ jakoby byla lokální. Objekt „service“ je ale zástupný objekt („proxy“), který volání metody předá webové službě – postará se tedy o vytvoření SOAP zprávy, její doručení, příjem odpovědi, její dekódování a převod zpět do datových typů jazyka Java.
8 Závěr Formát XML se ukázal býti velmi užitečným a použitelným nástrojem. Rodina standardů založených na XML se utěšeně rozrůstá a dostává se do oblastí, kde by se to ještě nedávno vůbec nečekalo. Překotný rozvoj s sebou samozřejmě nese i některé nedostatky, které jsou důsledkem toho, že na odpovídajících specifikacích pracuje velké množství lidí, kteří třeba původně nebyli odborníky v dané problematice. Pokud by se např. specifikace transformačního jazyka dostala do ruky specialistům na přepisování, asi by dopadla jinak. Tyto nedostatky se však časem pravděpodobně napraví. Velkou oblastí pro další zkoumání je právě sémantika přenášených dat.
Literatura [Ko02] Kosek, J: Inteligentní podpora navigace na WWW s využitím XML. Diplomová práce KIT VŠE Praha, 2002, URL: http://www.kosek.cz/diplomka/ [Ku01] Kudibal,I: Využití XML technologií na VŠE. Diplomová práce KIT VŠE Praha, 2001. [Ml04] Mlýnková, I: XML Schema. In: Sborník z XXIV.konference EurOpen.CZ, Sněžník, Dolní Morava, 2004. [Ni01] Nič, M.: SOAP Reference, 2001. URL: http://www.zvon.org/xxl/soapReference/ [OASIS02] OASIS Committee Specifications, Universal Description, Discovery and Integration, UDDI Version 3.0, Published Specification, 19 July 2002, URL: http://uddi.org/specification.html [PR00] Pokorný, J. - Richta, K.: XML a semistrukturovaná data. In: Proceedings of DATASEM 2000. Brno: Masarykova universita - ISBN 80-210-2428-3, str. 47-63. [Po04] Pokorný, J: XML databáze. In: Sborník z XXIV.konference EurOpen.CZ, Sněžník, Dolní Morava, 2004. [Ri01] Richta, K.: Types in XML and XML-schemas. In: DATESO'01 - Proceedings of Workshop on Databases, Texts, Specifications, and Objects. Desná – Černá Říčka, Vydavatelství ČVUT Praha, 2001, str. 20-32. ISBN 80-01-02376-1. [SAX02] http://sax.sourceforge.net/ [Sm99] Smolík,P.: The Importance of Extensible Markup Language. In: ISM’99 (ed.: Hruška,T.), ACTA MOSIS no.74, str. 33-40, ISBN 80-85988-31-3, MARQ, Ostrava 1999. [ToK04] Toman, K: XQuery. In: Sborník z XXIV.konference EurOpen.CZ, Sněžník, Dolní Morava, 2004. [ToV04] Toman, V: Komprese XML dat. In: Sborník z XXIV.konference EurOpen.CZ, Sněžník, Dolní Morava, 2004.
[Va01] Vasudevan, V.: A Web Services Primer. 2001, URL: http://webservices.xml.com/pub/a/ws/2001/04/04/webservices/ [WG99] Walsh,N. – Grosso,P.: XSL The Extensible Style Language Tutorial. In: XML'98, Seattle, WA, 1999, URL: http://www.webtechniques.com/archives/1999/01/walsh/ [W3C99a] Raggett,D. – Hors,A.L., Jacobs,I. (eds.): HTML 4.01 Specification. W3C Recommendation 24 December 1999. URL: http://www.w3c.org/TR/REC-html40/ [W3C99b] Clark,J (ed.): XSL Transformations (XSLT) 1.0. W3C Recommendation 16 November 1999. URL: http://www.w3.org/TR/xslt/ [W3C99c] Clark,J – DeRose,S.: XML Path Language (XPath) 1.0. W3C Recommendation 16 November 1999. URL: http://www.w3.org/TR/xpath/ [W3C01a] DeRose,S. – Maler,E. – Orchard,D.: XML Linking Language (XLink) 1.0. W3C Recommendation 27 June 2001. URL: http://www.w3.org/TR/xlink/ [W3C01b] Adler, S. & all: (eds.): Extensible Stylesheet Language (XSL) 1.0. W3C Recommendation 15 October 2001. URL: http://www.w3c.org/TR/xsl/ [W3C02] W3C: Web Services Activity. URL: http://www.w3.org/2002/ws/ [W3C03a] Mitra, N.: SOAP Version 1.2 Part 0: Primer, W3C Recommendation 24 June 2003. URL: http://www.w3.org/TR/soap12-part0/ [W3C03b] XQuery 1.0 and XPath 2.0 Data Model, W3C Working Draft 12 November 2003, http://www.w3.org/TR/xpath-datamodel/ [W3C04a] Bray,T. – Paoli,J.- Sperberg-McQueen,C.M., Green, E., Yergeau, F. (eds.): Extensible Markup Language (XML) 1.0. W3C Recommendation (Third Edition) 2February-2004. URL: http://www.w3c.org/TR/REC-xml/ [W3C04b] Web Services Description Language (WSDL) Version 2.0, W3C Working Draft 26 March 2004, http://www.w3.org/TR/wsdl20/ [XML04a] http://www.xml.com/ [XML04b] http://www.ibm.com/developer/xml/ [XML04c] http://www.microsoft.com/xml