KAPITOLA 6. XML, XPath a XSLT. Podpora XML v prohlížečích. XML DOM v IE



Podobné dokumenty
Rozhraní pro práci s XML dokumenty. Roman Malo

Podpora XML v.net. Podpora XML v.net. nezávislý publicista. Jirka Kosek.

XSLT pomocí JavaScriptu v Mozille (... Opeře a Safari)

Internet - internetové prohlížeče

Ajax - úvod. Klíčové pojmy: Ajax, skriptování na straně klienta a serveru, objekt XMLHttpRequest, DOM model.

PRG036 Technologie XML

Java a XML. 10/26/09 1/7 Java a XML

NSWI096 - INTERNET JavaScript

Z. Kotala, P. Toman: Java ( Obsah )

AJAX. Dynamické změny obsahu stránek

TÉMATICKÝ OKRUH Softwarové inženýrství

Tvorba informačních systémů

PROMĚNNÉ, KONSTANTY A DATOVÉ TYPY TEORIE DATUM VYTVOŘENÍ: KLÍČOVÁ AKTIVITA: 02 PROGRAMOVÁNÍ 2. ROČNÍK (PRG2) HODINOVÁ DOTACE: 1

1 Webový server, instalace PHP a MySQL 13

Střední škola pedagogická, hotelnictví a služeb, Litoměříce, příspěvková organizace

Část 1 Moderní JavaScript

1. Úvod do Ajaxu 11. Jak Ajax funguje? 13

PRG036 Technologie XML

APS Administrator.OP

1. Webový server, instalace PHP a MySQL 13

Programování v jazyce JavaScript

Jazyk XSL XPath XPath XML. Jazyk XSL - rychlá transformace dokumentů. PhDr. Milan Novák, Ph.D. KIN PF JU České Budějovice. 9.

3 MOŽNÉ PŘÍSTUPY K TVORBĚ APLIKACÍ NAD SVG DOKUMENTY

Nastavení provozního prostředí webového prohlížeče pro aplikaci

Základy HTML, URL, HTTP, druhy skriptování, formuláře

Semestrální práce 2 znakový strom

Obsah přednášky. XML DOM SAX XPath XSL transformace 1/46

HTML - Úvod. Zpracoval: Petr Lasák

Tento studijní blok má za cíl pokračovat v základních prvcích jazyka Java. Konkrétně bude věnována pozornost rozhraním a výjimkám.

Vytváříme aplikace využívající Ajax

8 Třídy, objekty, metody, předávání argumentů metod

Konvertor diakritiky 3. Instalace

Systém elektronického rádce v životních situacích portálu

Uživatelský manuál. Aplikace GraphViewer. Vytvořil: Viktor Dlouhý

TÉMATICKÝ OKRUH Softwarové inženýrství

5a. Makra Visual Basic pro Microsoft Escel. Vytvořil Institut biostatistiky a analýz, Masarykova univerzita J. Kalina

Používání u a Internetu

Registr práv a povinností

02. HODINA. 2.1 Typy souborů a objektů. 2.2 Ovládací prvky Label a TextBox

Použití inteligentních značek s informačními službami

Michal Krátký. Tvorba informačních systémů, 2008/2009. Katedra informatiky VŠB Technická univerzita Ostrava. Tvorba informačních systémů

Webové rozhraní pro datové úložiště. Obhajoba bakalářské práce Radek Šipka, jaro 2009

API pro práci s XML. Jirka Kosek. Poslední modifikace: $Date: 2014/12/17 17:15:28 $ Copyright Jiří Kosek

Rychlé nastavení mobilní aplikace Novell Vibe

Moje Cisco Nejčastější dotazy

Připravil: Ing. Jiří Lýsek, Ph.D. Verze: Webové aplikace

Návrh stránek 4IZ228 tvorba webových stránek a aplikací

Prezentace XML. XML popisuje strukturu dat, neřeší vzhled definice vzhledu:

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007

ČNHP. Příručka pro pacienty. Institut biostatistiky a analýz. Vytvořil:

Programování v jazyce JavaScript

Základy programování. Úloha: Eratosthenovo síto. Autor: Josef Hrabal Číslo: HRA0031 Datum: Předmět: ZAP

TECHNOLOGIE ELASTICKÉ KONFORMNÍ TRANSFORMACE RASTROVÝCH OBRAZŮ

CENTRÁLNÍ DATABÁZE. příručka pro práci s Centrální databází

24. XML. Aby se dokument XML vůbec zobrazil musí být well-formed (správně strukturovaný). To znamená, že splňuje formální požadavky specifikace XML.

Michal Krátký. Tvorba informačních systémů, 2008/2009. Katedra informatiky VŠB Technická univerzita Ostrava. Tvorba informačních systémů

Mgr. Stěpan Stěpanov, 2013

Tvorba informačních systémů

Základy datových vazeb Silverlightu. Funkce Silverlightu 2. Podpora jazyků a technologie.net Framework

Nastavení klientských stanic pro webové aplikace PilsCom s.r.o.

HTML Hypertext Markup Language

Škola: Gymnázium, Brno, Slovanské náměstí 7 III/2 Inovace a zkvalitnění výuky prostřednictvím ICT Název projektu: Inovace výuky na GSN

Databáze pro evidenci výrobků

Obrázek 6.14: Prohlížec nápovedy

Autor. Potřeba aplikací sdílet a udržovat informace o službách, uživatelích nebo jiných objektech

4a. Makra Visual Basic pro Microsoft Excel Cyklické odkazy a iterace Makra funkce a metody

Registrační číslo projektu: CZ.1.07/1.5.00/ Elektronická podpora zkvalitnění výuky CZ.1.07 Vzděláním pro konkurenceschopnost

Platforma.NET 11.NET Framework 11 Visual Basic.NET Základní principy a syntaxe 13

Provozní dokumentace. Seznam orgánů veřejné moci. Příručka pro běžného uživatele

FAKULTA INFORMAČNÍCH TECHNOLOGIÍ SPOLEČNOST DECADIC PROJEKT FRAMETRIX

APLIKACE XML PRO INTERNET

Kapitola 1 První kroky v tvorbě miniaplikací 11

Druhy souborů. textové. binární. nestrukturované txt strukturované - ini, xml, csv. veřejné bmp, jpg, wav proprietární docx, cdr, psd

Obsah. Začínáme programovat v Ruby on Rails 9. Úvod Vítejte v Ruby 15. O autorovi 9 Poděkování 9

PODOBÁ SE JAZYKU C S NĚKTERÝMI OMEZENÍMI GLOBÁLNÍ PROMĚNNÉ. NSWI162: Sémantika programů 2

Projekt Obrázek strana 135

VISUAL BASIC. Práce se soubory

DUM č. 11 v sadě. 36. Inf-12 Počítačové sítě

Uživatelská dokumentace

Mapa Česka:

3. HODINA. Prohlížeče Druhy prohlížečů Přehled funkcí Bc. Tomáš Otruba, Informatika 7. třída 1

Registr práv a povinností

Uživatelská dokumentace

Rozklad na prvočinitele. 3. prosince 2010

JavaScript 101. "Trocha života do statických stránek"

Implementace systémů HIPS: historie a současnost. Martin Dráb

K8055D.DLL v Technická příručka. Úvod. Obecné. Konvence volání. Nastavení adresy karty

Oracle XML DB. Tomáš Nykodým

Internet 1. ÚVOD. Příklad stránky WWW v prostředí Internet Exploreru vidíte na obr.:

typová konverze typová inference

Připravil: Ing. Jiří Lýsek, Ph.D. Verze: Webové technologie

Výjimky a ošetřování chyb v PHP. Who is General Failure and why is he reading my disk?!

Zabezpečení proti SQL injection

PODMÍNKY POSKYTOVÁNÍ PŘÍSTUPU K PORTÁLU NAMĚŘENÝCH DAT POMOCÍ WEBOVÝCH SLUŽEB SPOLEČNOSTI ČEZ DISTRIBUCE, A. S.

Formulář NÚV v programu PPP4

VZOROVÝ STIPENDIJNÍ TEST Z INFORMAČNÍCH TECHNOLOGIÍ

Studentská tvůrčí a odborná činnost STOČ 2013

Připojení ke vzdálené aplikaci Target 2100

Transkript:

KAPITOLA 6 XML, XPath a XSLT S rostoucí popularitou XML chtěli vývojáři tuto technologii použít na obou stranách jak na straně serveru, tak i na straně uživatele. Microsoft a Mozilla, počínaje Internet Explorerem 5.0 a Mozillou 1.0 (předchůdcem Firefoxu), do svých prohlížečů implementovali podporu XML v JavaScriptu. Opera 8 a Safari 1.2 umožnily základní formu podpory XML. Zatímco Opera podporu XML v JavaScriptu neustále rozvíjí, Safari o něco zaostává a dnes má nejmenší podporu XML. Tvůrci prohlížečů pokračují v rozšiřování podpory XML pomocí různých nových rysů, čímž vývojářům nabízejí silné nástroje, které jsou podobné těm, jež bylo původně možné nalézt pouze na serveru. Podpora XML v prohlížečích V současné době je dostupných mnoho webových prohlížečů, ale jen několik z nich má úplnou podporu XML a s tím spojených technologií. Vedoucí postavení mezi nimi zaujímá Internet Explorer (IE) a Mozilla Firefox, těsně za nimi je Opera (verze 9). O velký kus dále za nimi se vleče Safari od Apple, který podporuje pouze základní rysy XML. Navzdory těmto rozdílům všechny zmíněné prohlížeče obsahují základní funkčnosti XML, takže v této části se můžeme zabývat těmito čtyřmi hlavními prohlížeči. XML DOM v IE Microsoft přidal podporu XML do IE 5.0 tím, že do něj zařadil ActiveX knihovnu MSXML, což byla komponenta, která byla původně vytvořena pro zpracování aktivních kanálů v IE 4.0. Tato původní verze komponenty nebyla zamýšlena pro užívání veřejností, nicméně vývojáři ji objevili a začali ji používat. Microsoft pak zareagoval celkovou aktualizací verze MSXML, která byla obsažena v IE 4.01. Knihovna MSXML byla zpočátku součástí pouze IE. Kapitola 06.indd 179 15.10.2007 14:08:34

180 Kapitola 6 XML, XPath a XSLT Toto trvalo až do roku 2001, kdy Microsoft vydal MSXML 3.0 samostatné rozšíření, které bylo dostupné skrze webové stránky společnosti. Později v tomto roce byla vydána verze 4.0 a knihovna MSXML se přejmenovala na Microsoft XML Core Services Component. Od svého vzniku MSXML prošla vývojem od základního a neplatného (nevalidního) XML parseru až po silnou komponentu, která může ověřovat platnost XML dokumentů, provádět XSL transformace, podporovat jmenné prostory, jednoduché API pro XML (SAX) či různé W3C standardy jako Xpath nebo schémata XML. A každá nová verze je výkonnější. Vytvoření objektu XML DOM Za účelem usnadnění vytváření objektů ActiveX v JavaScriptu zavedl Microsoft třídu zvanou ActiveXObject. Její konstruktor přijímá jeden argument řetězec obsahující jméno a verzi objektu ActiveX, který má být vytvořen. V tomto případě se jedná o verzi XML dokumentu. První ActiveX objekt XML DOM byl pojmenován jako Microsoft.XmlDom a jeho vytvoření vypadá takto: var oxmldom = new ActiveXObject("Microsoft.XmlDom"); Nově vytvořený objekt XML DOM se nechová stejně jako každý jiný objekt DOM umožňuje vám totiž procházet stromovou strukturou DOM a manipulovat s uzly DOM. V době, kdy vznikala tato kniha, existovalo celkem 6 různých verzí MSXML DOM. Jedná se o následující řetězce verzí: Microsoft.XmlDom. MSXML2.DOMDocument. MSXML2.DOMDocument.3.0. MSXML2.DOMDocument.4.0. MSXML2.DOMDocument.5.0. MSXML2.DOMDocument.6.0. Knihovna MSXML je dostupná pouze na Internet Exploreru ve Windows. Internet Explorer 5 na počítačích Mac nemá podporu XML DOM. Protože každá nově vydaná knihovna MSXML přináší mnoho vylepšení, měli byste vždy používat tu nejnovější. Microsoft doporučuje kontrolovat existenci nejnovějších verzí (v době psaní této knihy to byla MSXML6). Dále doporučuje v případě problémů používat verzi MSXML3. Z pohledu vývojáře tedy bude užitečné vytvořit funkci, jež by určila, kterou verzi použít. Následující funkce createdocument() vytvoří MSXML6 DOM, pokud ji počítač uživatele podporuje. V opačném případě je vytvořena MSXML3 DOM: function createdocument() { var aversions = [ Kapitola 06.indd 180 15.10.2007 14:08:38

Ajax Profesionálně 181 } ]; "MSXML2.DOMDocument.6.0", "MSXML2.DOMDocument.3.0", for (var i = 0; i < aversions.length; i++) { } try { } var oxmldom = new ActiveXObject(aVersions[i]); return oxmldom; } catch (oerror) { //Nedělej nic throw new Error("MSXML is not installed."); Tato funkce provádí iterace skrz pole aversions, jež zahrnuje řetězce verzí. Začíná s nejnovější verzí MSXML2.DOMDocument.6.0 a snaží se vytvořit dokument DOM. Pokud je vytvoření objektu úspěšné, je vrácen a funkce createdocument() je ukončena. V opačném případě je vyhozena výjimka, která je pak zachycena pomocí bloku try...catch, takže smyčka pokračuje a vyzkouší se další verze. Pokud tvorba MSXML DOM dokumentu selže po dvou pokusech, je vyhozena výjimka, že knihovna MSXML není nainstalována. Volání funkce vypadá takto: var oxmldom = createdocument(); V tuto chvíli máte XML dokument k dispozici a je čas načíst nějaká data XML. Načítání XML dat v IE Dokument MSXML DOM podporuje dvě metody načítání dat XML load() a loadxml(). Metoda load() přijímá jeden argument, což je URL, ze které má být stažen XML soubor. Metoda loadxml() také přijímá jeden argument, jedná o řetězec dat XML. Obě metody mají za následek analýzu (parsování) dat XML a vytvoření struktury XML DOM. Metoda load() se chová podobně jako XHR v tom, že může načítat data z externího souboru ve dvou režimech: asynchronním nebo synchronním. To nastavíte ve vlastnosti async. Standardně má async hodnotu true, takže load() metoda je asynchronní. Pro použití synchronního režimu musí být vlastnost async nastavena na false: oxmldom.async = false; Obecně je považováno za nepraktické vykonávat požadavky v synchronním režimu (kvůli možnosti zamrznutí uživatelského rozhraní). Synchronní režim by měl být používán šetrně a pouze v případě, kdy je ze serveru posíláno velmi malé množství dat. Kapitola 06.indd 181 15.10.2007 14:08:38

182 Kapitola 6 XML, XPath a XSLT V asynchronním režimu vystavuje objekt MSXML vlastnost readystate, která má v podstatě pět stejných stavů jako XHR vlastnost readystate (popsáno v kapitole 2). Výjimkou je, že objekt MSXML nemá stav 0 (UNITIALIZED). Dokument DOM navíc podporuje ovladač události onreadystatechange, který umožňuje sledovat vlastnost readystate: oxmldom.onreadystatechange = function () { if (oxmldom.readystate == 4) { //Dělej něco, když jsou data kompletně načtena. } }; oxmldom.load("myxml.xml"); V tomto příkladě je do XML DOM načten fiktivní XML dokument s názvem myxml.xml. Když readystate dosáhne hodnoty 4, je dokument plně načten a kód uvnitř bloku if bude proveden. Všimněte si, že na rozdíl od objektu XHR neexistuje v objektu XML DOM vlastnost status. Druhá možnost, jak načíst XML data metoda loadxml() je poněkud jednodušší a nevyžaduje žádné HTTP příkazy, protože data jsou již přítomna v počítači klienta. Předaná data musí obsahovat správně zformované XML, jako v následujícím příkladu: var sxml = "<root><person><name>jeremy McPeak</name></person></root>"; oxmldom.loadxml(sxml); V tomto případě jsou XML data obsažena v proměnné sxml a jsou načítána do dokumentu oxml- Dom. Není zde žádný důvod kontrolovat vlastnost readystate nebo nastavovat vlastnost async, protože neobsahuje příkazy serveru data jsou načítána synchronně a jsou dostupná okamžitě. Kontrola platnosti XML dat v průběhu načítání Objekt MSXML DOM standardně ověřuje platnost XML dokumentu, když analyzuje data. Platný XML dokument je takový dokument, který obsahuje referenci na definici typu dokumentu (DTD) v deklaraci DOCTYPE a přizpůsobuje se tomuto DTD. Může se stát, že toto chování nebude žádoucí. V takovém případě bude vhodnější, aby byla zkontrolována pouze struktura dokumentu. Aby to bylo možné, poskytuje objekt MSXML DOM vlastnost validateonparse. Povolené hodnoty jsou true (výchozí), nebo false, přičemž by měla být nastavena před tím, než objekt DOM načte dokument. var oxmldom = createdocument(); oxmldom.async = false; oxmldom.validateonparse = false; oxmldom.load("myxml.xml"); Kapitola 06.indd 182 15.10.2007 14:08:38

Ajax Profesionálně 183 V tomto kódu, kdy objekt XML DOM načítá a analyzuje kód XML, bude kontrola probíhat pouze za účelem kontroly správné struktury dokumentu. Ochrana prázdných znaků MSXML DOM zachází s prázdnými znaky (whitespace) jinak než je standardem v DOM. MSXML DOM standardně odstraňuje z dokumentu pouze uzly s prázdnými znaky nenechává nic kromě XML a textových uzlů. Zatímco mnozí považují tuto vlastnost za rozumnou, skutečnost je taková, že je to docela nepraktické. MSXML DOM ovšem nabízí vlastnost preservewhitespace, která říká parseru, aby uzly s prázdnými znaky zamítl nebo povolil. Tato vlastnost má logickou hodnotu výchozí je false. Následující kód načítá XML dokument a zabraňuje odstranění prázdných znaků v něm: var oxmldom = createdocument(); oxmldom.async = false; oxmldom.preservewhitespace = true; oxmldom.load("myxml.xml"); Pokud je tato vlastnost preservewhitespace nastavena na true, dovoluje, aby se objekt MSXML DOM choval jako standardní DOM. Procházení XML DOM v IE Navigace v dokumentu XML DOM je podobná navigaci dokumentu DOM HTML je to struktura hierarchicky uspořádaných uzlů. Na vrcholu stromu je documentelement, který obsahuje kořenový prvek dokumentu. Z tohoto místa můžete zpřístupnit kterýkoliv prvek nebo atribut dokumentu pomocí vlastností uvedených v tabulce 6-1. Tabulka 6-1. Vlastnosti XML DOM. Vlastnost attributes childnodes firstchild lastchild nextsibling nodename nodetype nodevalue ownerdocument Popis Kolekce atributů pro tento uzel. Kolekce potomků (dceřiných uzlů). První potomek uzlu. Poslední potomek uzlu. Uzel bezprostředně následující po aktuálním uzlu. Jméno uzlu. XML DOM typ uzlu. Text spojený s uzlem, pokud existuje. XML DOM dokument, jehož částí uzel je. Kapitola 06.indd 183 15.10.2007 14:08:38

184 Kapitola 6 XML, XPath a XSLT Vlastnost ParentNode PreviousSibling Text Xml Popis Rodičovský uzel aktuálního uzlu. Uzel bezprostředně předcházející aktuálnímu uzlu. Vrací obsah uzlu nebo zřetězený text současného uzlu a jeho potomků. Vrací XML řetězec reprezentující současný uzel a jeho potomky. Pouze v IE. Procházení a získávání dat z DOM je přímočarý proces. Mějme následující XML dokument: <?xml version="1.0" encoding="utf-8"?> <books> <book isbn="9780470109496">professional Ajax</book> <book isbn="0764579088">professional JavaScript for Web Developers</book> <book isbn="0764557599">professional C#</book> <book isbn="1861002025">professional Visual Basic 6 Databases</book> </books> Tento jednoduchý XML dokument obsahuje kořenový prvek <books> se čtyřmi potomky <book>. Použitím tohoto dokumentu jako ukazatele můžete prozkoumat DOM. Strom DOM je založen na vztazích mezi uzly. Jeden uzel může obsahovat jiné uzly, které jsou nazývány jako dceřiné uzly (každý prvek <book> je dceřiným uzlem prvku <books>). Další uzel může sdílet stejné rodiče jako jiné uzly v takovém případě se uzly nazývají jako sourozenci (siblings, každý prvek <book> je sourozencem jiných prvků <book>). Předpokládejme, že budete chtít získat první prvek <book> v dokumentu. Toho snadno dosáhnete pomocí vlastnosti firstchild: var ofirstbook = oxmldom.documentelement.firstchild; Použitím vlastnosti firstchild je získána reference na první prvek <book> a je přiřazen do proměnné ofirstbook, protože je to první dceřiný prvek kořenového prvku <books>. K získání stejného výsledku můžete rovněž použít kolekci childnodes: var ofirstbook2 = oxmldom.documentelement.childnodes[0]; Výběr prvního prvku v kolekci childnodes (na indexu 0) vrací prvního potomka uzlu (stejně jako použití vlastnosti firstchild). Pomocí vlastnosti length můžete snadno určit počet potomků, které má daný uzel. var ichildren = oxmldom.documentelement.childnodes.length; Pokud může mít nějaký uzel potomky, znamená to, že potomci mohou mít rodiče. Vlastnost ParentNode vrací rodiče daného uzlu. var oparent = ofirstbook.parentnode; Kapitola 06.indd 184 15.10.2007 14:08:38

Ajax Profesionálně 185 Připomínáme, že ofirstbook je první prvek <book> v dokumentu. Vlastnost ParentNode tohoto uzlu se odkazuje na prvek <books>, na documentelement dokumentu. Jednotlivé prvky <book> jsou vzájemně sourozenci, protože mají stejného přímého rodiče. Existují dvě vlastnosti pro zpřístupnění těchto sousedních uzlů nextsibling a previoussibling. Vlastnost nextsibling se odkazuje na následujícího sourozence, zatímco vlastnost previous Sibling vybírá předcházejícího sourozence: var osecondbook = ofirstbook.nextsibling; var ofirstbook2 = osecondbook.previoussibling; V tomto kódu je druhý prvek <book> přiřazen k osecondbook. Proměnná ofirstbook2 je pak přiřazena k předchozímu sourozenci osecondbook, což má za následek to, že ofirstbook2 obsahuje stejné hodnoty jako ofirstbook. Pokud uzel nemá žádné předcházející nebo následující sourozence, previoussibling a nextsibling budou null. Když nyní víte, jak procházet skrze hierarchii dokumentu, je dalším krokem provést extrakci z uzlů ve stromu. Například pro získání textu obsaženého uvnitř třetího prvku <book> ("Professional C#") můžete použít vlastnost text následujícím způsobem: var stext = oroot.childnodes[2].text; Vlastnost text získá kompletní text, který je obsažený v tomto uzlu. Je to sice patentovaná vlastnost Microsoftu, ale je velice užitečná. Bez ní byste museli text uzlu zpřístupnit takto: var stext = oroot.childnodes[2].firstchild.nodevalue; Tento kód získává stejné výsledky jako použití vlastnosti text. Stejně jako v předchozím příkladě i zde je reference na třetí prvek <book> získána pomocí kolekce childnodes. Reference na text uzlu z prvku <book> je pak získána s použitím firstchild, protože textový uzel je pořád DOM uzel. Samotný text je pak získáván s použitím vlastnosti nodevalue, která je pro textový uzel vždy nastavena na jeho obsah. Výsledky těchto dvou příkladů jsou identické, ačkoliv se vlastnost text chová jinak, než je použití vlastnosti nodevalue na textový uzel. Vlastnost text získává hodnotu všech textových uzlů obsažených v prvku a jeho potomcích, zatímco vlastnost nodevalue získává hodnoty pouze ze současného uzlu. Vlastnost text je sice užitečná, ale může také vrátit více textu, než by bylo žádoucí. <?xml version="1.0" encoding="utf-8"?> <books> <book isbn="9780470109496"> <title>professional Ajax</title> <author>nicholas C. Zakas, Jeremy McPeak, Joe Fawcett</author> </book> <book isbn="0764579088">professional JavaScript for Web Developers</book> <book isbn="0764557599">professional C#</book> <book isbn="1861002025">professional Visual Basic 6 Databases</book> Kapitola 06.indd 185 15.10.2007 14:08:38

186 Kapitola 6 XML, XPath a XSLT </books> Tento nový XML dokument přidává dva nové potomky k prvnímu prvku <book> prvek <title>, který obsahuje název knihy, a prvek <author>, jenž obsahuje data o autorech. Znovu použijte vlastnost text: alert(ofirstbook.text); V tomto kódu není nic nového, ale podívejte se na výsledky, které jsou ukázány na obrázku 6-1. Obrázek 6-1. Výsledek kódu. Všimněte si, že textové uzly z prvků <title> a <author> byly získány a zřetězeny. Pokud byste použili ofirstbook.nodevalue, vrátilo by se null, protože ofirstbook není textovým uzlem. Existuje mnoho metod pro získání uzlů a hodnot z XML uzlů dvě nejčastěji používané jsou get- Attribute() a getelementsbytagname(). Metoda getattribute() vezme řetězec argumentů obsahujících název atributu, který chcete získat. Pokud atribut neexistuje, vrátí se hodnota null. Pokud použijeme stejný XML dokument, který byl uveden dříve v této kapitole, můžeme pracovat s následujícím kódem: var sattribute = ofirstbook.getattribute("isbn"); alert(sattribute); Tento kód získává hodnotu atributu isbn z prvního prvku <book> a přiřazuje ho k proměnné sattribute. Tato hodnota je pak zobrazena pomocí alert(). Metoda getelementsbytagname() vrací NodeList dceřiných prvků se specifikovaným jménem prvku. Tato metoda vyhledává prvky pouze v daných potomcích uzlu, takže vrácený NodeList neobsahuje žádné prvky, které by byly předky nebo potomky předků. Například: Kapitola 06.indd 186 15.10.2007 14:08:38

Ajax Profesionálně 187 var cbooks = oroot.getelementsbytagname("book"); alert(cbooks.length); Tento kód získává všechny prvky <book> v dokumentu a vrací NodeList do cbooks. V našem příkladě s XML dokumentem se zobrazí výstražné okno, že byly nalezeny 4 prvky <book>. K získání všech potomků prvků zadejte * jako parametr do getelementsbytagname(). Následovně: var celements = oroot.getelementsbytagname("*"); V tomto případě kolekce celements obsahuje prvky <book> i <title> a <author>. Získávání dat XML v IE Získávání dat XML je stejně jednoduché jako používání nějaké vlastnosti, v tomto případě vlastností xml. Tato vlastnost serializuje data XML ze současného uzlu. Serializace je proces konverze objektů do snadno uložitelných a přenositelných formátů. Vlastnost xml kompletně zkonvertuje XML do řetězcové reprezentace se jmény prvků, atributů a textem: var sxml = oroot.xml; alert(sxml); Tento kód serializuje data XML počínaje kořenovým prvkem dokumentu. Výsledek je pak předán metodě alert(). Část serializovaných dat vypadá nějak takto: <books><book isbn="9780470109496">professional Ajax</book></books> Serializovaná data je možné načíst do jiného objektu XML DOM, poslat je serverové aplikaci nebo je předat jiné stránce. Serializovaná data XML, která jsou vrácená vlastností xml, závisí na aktuálním uzlu. Použití vlastnosti xml v uzlu documentelement vrací data XML z celého dokumentu, zatímco její použití v prvku <book> vrací pouze data obsažená v tomto prvku <book>. Vlastnost xml je pouze pro čtení. Pokud chcete přidat nějaké prvky do dokumentu, budete muset použít metody DOM, což je popsáno dále v této kapitole. Manipulace s DOM v IE Do této chvíle jste se naučili, jak procházet strukturou DOM, jak z něj vytáhnout informace, a jak převést XML do řetězce. Nyní si ukážeme, jak v DOM přidat, smazat a přemístit uzly. Vytváření uzlů Použitím metod DOM můžete vytvořit několik různých uzlů nejčastěji používaná je ovšem metoda createelement(). Tato metoda přijímá jeden argument: řetězec obsahující název prvku, který má vytvořit. Vrátí ukazatel na XMLDOMElement: Kapitola 06.indd 187 15.10.2007 14:08:38

188 Kapitola 6 XML, XPath a XSLT var onewbook = oxmldom.createelement("book"); oxmldom.documentelement.appendchild(onewbook); Tento kód vytvoří nový prvek <book> a připojí ho k documentelement použitím metody append- Child(). Tato metoda přidává nové prvky, specifikované jejími argumenty, za poslední dceřiný uzel. Výše uvedený kód přidá do dokumentu prázdný prvek <book>, takže je potřeba k němu doplnit nějaký text, jako zde: var onewbook = oxmldom.createelement("book"); var onewbooktext = oxmldom.createtextnode("professional.net 2.0 Generics"); onewbook.appendchild(onewbooktext); oxmldom.documentelement.appendchild(onewbook); Tento kód vytvoří textový uzel pomocí metody createtextnode() a připojí ho k nově vytvořenému prvku <book> pomocí appendchild(). Metoda createtextnode() přijímá řetězec jako argument, který specifikuje textový obsah uzlu. V tomto bodě jsme programově vytvořili nový prvek <book>, poskytli mu textový uzel a připojili ho k dokumentu. Aby se tento nový prvek mohl stát sourozeneckým s okolními prvky <book>, potřebujeme specifikovat ještě jednu informaci atribut isbn. Vytvoření tohoto atributu je jednoduché stačí použít metodu setattribute(), která je přístupná pro každý prvek uzlu. var onewbook = oxmldom.createelement("book"); var onewbooktext = oxmldom.createtextnode("professional.net 2.0 Generics"); onewbook.appendchild(onewbooktext); onewbook.setattribute("isbn","0764559885"); oxmldom.documentelement.appendchild(onewbook); Zvýrazněný řádek kódu v tomto případě vytvoří atribut isbn a přiřadí mu hodnotu 0764559885. Metoda setattribute() pracuje se dvěma řetězci jako argumenty: první argument je název atributu, druhý argument je jeho hodnota. IE poskytuje i jiné metody pro přidávání atributů k prvku. Tyto metody ovšem nenabízejí žádnou významnou výhodu oproti setattribute(), nehledě na to, že vyžadují mnohem více kódování. Odstraňování, nahrazování a vkládání uzlů Pokud umíte přidávat uzly do dokumentu, zdá se být logické, že byste měli být schopni je stejně snadno i odstranit. To uděláte pomocí metody removechild(). Tato metoda přijímá jeden argument uzel k odstranění. K odstranění prvního prvku <book> z dokumentu může být použit následující kód: var oremovedchild = oroot.removechild(oroot.firstchild); Metoda removechild() vrací dceřiný uzel, který byl odstraněn, takže oremovedchild se odkazuje na odstraněný prvek <book>. Pokud máte odkaz (referenci) na starý uzel, můžete jej umístit kamkoliv jinam v dokumentu. Kapitola 06.indd 188 15.10.2007 14:08:39