... avšak existují tyto rozdíly: nejenom že v XML můžeme definovat libovolný tag, můžeme definovat libovolný atriut, a omezení je v tom, že hodnota atributu musí být na rozdíl od syntaxe HTML uzavřena v (anglických) uvozovkách.
Well-formed XML dokument Ne každý strukturovaný dokument s tagy splňuje požadavky kladené na XML dokument. Pokud daný dokument požadavky na XML strukturovanost splňuje, nazývá se well-formed XML dokumentem. Tyto požadavky lze shrnout do možných chyb, které dokument nesplní a nestane se tak well-formed dokumentem: Start a end tagy nesouhlasí Elementy se překrývají a chybně se vnořují do sebe XML je case sensitive, rozlišuje malá a velká písmena Neukončení tagů (např. prázdných) Reservované znaky < > ‘ & “ se musí nahradit jiným způsobem Root element (vrcholový element dokumentu) musí vždy existovat
Otázka Cvičná otázka pro posluchače semináře a čtenáře skript: Lze obecně dokument HTML považovat za well-formed dokument XML? Odpověď: Nikoliv. Protože HTML syntaxe není tak přísná, mohou existovat HTML dokumenty, které nejsou wellformed XML dokumenty. Například HTML povoluje použít neukončené elementy (
apod.) . Z druhé strany však platí, že každou HTML stránku lze za stejné funkcionality přepsat tak, aby byla well-formed XML dokumentem. Je tedy otázkou pouze „vnitřní přísnosti“ autora, zda se rozhodne psát stránky HTML splňující požadavky na well-formed XML dokumenty (a zda to má pro daný případ smysl).
11
základy xml autor: Ilja Kraval
strana 12/34
Příklad na HTML stránku jako well-formed XML dokument Příklad 3 (adresář 3) ukazuje na HTML stránku, která má „nedostatky“ z hlediska XML. Ukažme, jak se změní na well formed XML dokument. 1. stránka html seminare99.htm je v browseru IE5 funkční jako HTML stránka 2. soubor xml NotPerfect_seminare99.xml je přesnou kopií tohoto HTML souboru, pouze se změnila extense na xml. Otevřete tento soubor pomocí IE5. Objeví se chybové hlášení. Můžete postupně „odstraňovat chyby“ až do okamžiku zobrazení „správného“ xml souboru. 3. Soubor xml Perfect_seminare99.xml je již upraveným well-formed XML dokumentem. 4. Všimněte si, že i tento soubor po změně extense zpět na HTML bude jako HTML funkční.
Základy syntaxe XML Existuje celkem 6 druhů prvků XML dokumentu: Element (pojednáno v předešlé kapitole) Instrukce pro řízení procesu (processing instruction) CDATA sekce Reference na entity (entity reference) Reference na znaky (character reference) Komentáře (comments)
Instrukce pro řízení procesu Processing instruction (označované jako PI’s) nejsou přímo součástí obsahu dokumentu podobně jako komentáře. XML processor přebírá informace z těchto instrukcí a řídí jimi svoji činnost. PI mají tvar : Kde výraz aplikace je názvem aplikace, pro kterou je určena instrukce. Název aplikace xml je rezervován jako standard XML. Pro rezervované slovo xml se používají standardně tyto dvě instrukce: jedna informuje XML parser o verzi XML (nyní platí verze 1.0): version=”1.0” a použité kódování: encoding=“Windows-1250“ (pro češtinu) První tag XML dokumentu (v našich krajích) tedy bude vypadat takto:
12
základy xml autor: Ilja Kraval
strana 13/34
(viz příklad 3, kde první chybové hlášení je způsobeno právě chybějící PI pro nastavení kódování)
CDATA sekce Tato sekce slouží k přenosu informace v rámci XML dokumentu bez parsování podle markup znaků, tj. je to obdoba příkazů pro „binary“ data v jiných technologiích. Pomocí této sekce tedy můžete vložit libovolný výraz do XML dokumentu, i takový výraz, který obsahuje rezervované znaky. Pokud bychom zavedli element pro název zbraně například takto:
Smith & Wesson potom parser by se snažil interpretovat rezervovaný znak & uvedený v obsahu elementu a zřejmě neúspěšně, protože tento znak nemá význam rezervovaného znaku, ale je součástí řetězce. Proto je v této a podobné situaci třeba použít sekci CDATA, která dává parseru na vědomí, že tato část obsažená v sekci , se nemá interpretovat. Syntaxe CDATA sekce je následující: Všimněte si zahajovacího vykřičníku a dvojí hranaté závorky, první závorka uzavírá „vše v tagu“, druhá uzavírá obsah za CDATA výrazem. V našem příkladu s coltem Smith & Wesson bychom měli použít konstrukci:
Entity reference Reference na entitu vnutí parseru dosadit namísto reference určitá data. Existují dva základní důvody použití entity reference: Dosazení znaků, které je složité vložit - například je nelze přímo typovat Odkaz na jiné XML data jinde a tím dosáhnout pomocí odkazu výrazného zpřehlednění dokumentu. Syntaxe pro zavedení entity reference je jednoduchá, zahajuje se znakem & a ukončuje znakem ;, tj.. &refrence; V HTML se používají znaky, které nemají přímo vyjádření v kódu, ale existuje odkaz pomocí dvojice znaků & a ; . Patří sem: <
<
>
>
&
&
‘
'
“
"
Tyto odkazy jsou implicitní, kromě nich existuje možnost zavést své vlastní pomocí DTD (viz dále).
13
základy xml autor: Ilja Kraval
strana 14/34
Character reference Character reference - tj. „odkaz na znak“ umožňuje vložit takřka libovolný znak a to i takový, který není na klávesnici, ale vyskytuje se v seznamu normy ISO/IEC 10646. Seznam znaků této normy je možné nalézt na HTML stránce: http://www.unicode.org/unicode/uni2book/u2.html anebo pomocí FTP: ftp://ftp.unicode.org/Public/UNIDATA/UnicodeData-Latest.txt Pokud se má použít character reference, je třeba znát pořadové číslo tohoto znaku v uvedeném seznamu. Potom lze vložit znak pomocí syntaxe: číslo například £ je vloženým znakem pro anglickou libru.
Komentář Syntaxe pro komentář je stejná jako v HTML syntaxi: Protože XML je přísné a striktní na syntaxi, není dovoleno použít dvě pomlčky v komentáři, tj. na rozdíl od čehož v HTML je takováto konstrukce povolena. Častou chybou je konstrukce čárky v kódu pomocí pomlček: což samozřejmě v XML není povoleno. Namísto toho lze například použít syntaxi s rovnítkem:
Co je to DTD - Data Type Definition Výhodou XML je možnost vytvářet své vlastní tagy a definovat tak potřebné hierarchické struktury dat. Tato libovůle se může stát překážkou v případech, kdy je třeba provádět kontroly, zda dokument, který používáme, odpovídá svou strukturou dohodnuté definici. Představme si, že dostaneme do,aplikace XML dokument z jiné aplikace, který údajně nese informace o kurzovním lístku ČNB. Znamená to, že nad tvarem a strukturou tohoto dokumentu musí být nějaká dohoda „co kde může být“. Navíc tato dohoda by neměla být pouze abstraktní nebo ústní, protože aplikace by potřebovala nějakým způsobem verifikovat syntaktickou správnost dokumentu. K tomu slouží zobecnění přístupu k povolené syntaxi dokumentu a zavedení jednotného postupu při této verifikaci pomocí Data Type Definition - DTD. Poznámka: Existuje ještě možnost zavést tzv. XML Schema, které však není standardem, viz dále. Díky DTD nemusíme vytvářet dohody nad strukturami dokumentu případ od případu nějakými nestandardními jinými prostředky. DTD je tedy „návoedem“ jak definovat omezení pro XML dokumenty.
14
základy xml autor: Ilja Kraval
strana 15/34
Validovaný dokument XML Zmíněný proces verifikace správnosti dokumentu vůči dohodě o jeho strukturách se provádí pomocí definice v DTD. Tento proces se nazývá se validace dokumentu a pokud dokument souhlasí s jeho definicí v DTD, potom se nazývá validovaný dokument Je třeba podotknout, že zavedení DTD definice pro dokument není povinná. Je to však velmi výhodné z důvodu možnosti validace dokumentu a odstranění případných chyb a nekompatibilit.
DTD deklarace a dokument XML Deklarace DTD se může vyskytovat buď uvnitř dokumentu XML, který má tyto definice splňovat, anebo se z dokumentu XML na definice DTD provádí odkaz. Deklarace DTD resp. odkaz následuje v dokumentu XML hned za PI instrukcí . Deklarace DTD je vždy zahájena příkazem DOCTYPE tagu: přičemž název_root_element musí souhlasit s názvem rootu elementu XML dokumentu. Poznámka: název root elementu musí mít také deklaraci typu v ELEMENT deklaraci (viz dále) Externí zdroj deklarace DTD V hranaté závorce za názvem root elementu (viz předešlý odstavec) může být vložena deklarace DTD všech prvků anebo odkaz na jiný DTD dokument jako zdroj. Druhý případ má pochopitelnou výhodu možného sdílení DTD dokumentů několika XML dokumenty. V případě odkazu se používá následující syntaxe: např. :
Atribut standalone V souvislosti s připojením DTD k dokumentu XML je důležité znát funkci atributu standalone. V některých případech je povaha zavedeného DTD taková, že bez něj dokument XML ztrácí smysl nemá totiž bez DTD plnohodnotné informace. Problém je v tom, že DTD nejenom že deklaruje typy (což se dá při zpracování XML dokumentu oželet jako můžeme oželet kontrolní funkci), ale navíc DTD může obsahovat takové prvky, které do XML dokumentu vnášejí přímo informace. Jedná se například o implicitní nebo fixní hodnoty atributů. V tom případě dokument XML nemůže být použít korektně, protože aplikace by s těmito hodnotami počítala a očekával by jejich relevantní hodnoty nastavené implicitně nebo fixně. Z toho důvodu se zavádí atribut standAlone, jehož nastavení na hodnotu yes znamená, že dokument XML ke své interpretaci nepotřebuje DTD dokument, i když je na něj odkazováno. Atribut standalone se umisťuje do úvodního PI tagu
Deklarace typu elementu - ELEMENT Deklarace typu elementu identifikuje možný (a povinný) název elementu v XML dokumentu spolu s možnostmi jeho obsahu a spolu s následnou hierarchií podřízených elementů.
15
základy xml autor: Ilja Kraval
strana 16/34
Syntaxe deklarace typu elementu: kde název označuje možný (povolený a přitom povinný) název elementu v XML dokumentu, obsah označuje buď seznam názvů následných podřízených prvků anebo označení pro ukončení hierarchie (list stromu). Pokud již nemá mít element další podřízené prvky a má pouze svůj text, do závorky obsah se umisťuje výraz #PCDATA. Například takto deklarovaný prvek titul nemá mít již další podřízené prvky: a oproti tomu značí, že element barvy má obsahovat N elementů barva Speciální znaky pro ELEMENT deklarace Existují speciální znaky pro vztah parent a child elementů: ‘
apostrof - striktní pořadí
?
optional
+
jeden nebo více
*
nula nebo více
|
jeden z několika
( ) skupina Příklad znamená, že element cena jako child element elementu kniha není povinným podřízeným elementem elementu kniha.
Deklarace atributu Deklarace atributu umožňuje identifikovat: které elementy mají atributy jaké atributy tyto elementy mají jaké hodnoty mohou tyto atributy mít a jaké jsou implicitní hodnoty těchto atributů Deklarace atributu obsahuje tyto části: název elementu název atributu typ atributu
16
základy xml autor: Ilja Kraval
strana 17/34
a implicitní hodnotu Syntaxe deklarace atributu je následující: Například kniha má atribut titul Jako příklad deklarace atributu pro HTML kód bychom mohli uvést „klasický“ element tagu A - odkazu: čímž jsme vyjádřili, že tag - tj. element A je konečným elementem bez podřízených elementů a element A má atribut HREF. Možný povolený element A v XML dokumentu (který nevede k error při validaci XML dokumentu):
domů Deklarace možného typu atributu Existuje 6 možných typů atributů: CDATA ID IDREF nebo IDREFS ENTITY nebo ENTITIES NMTOKEN nebo NMTOKENS Seznam možných hodnot Atribut deklarovaný jako CDATA Atribut deklarovaný v DTD jako CDATA může v XML dokumentu obsahovat libovolný string. Atribut je určen pouze pro informaci hodnoty tohoto stringu. (příklad barva má svůj kód jako atribut) Atribut deklarovaný jako typ ID Atribut deklarovaný v DTD jako typ ID nese jednoznačný název - identifikátor vůči všem jiným atributům v celém dokumentu (unikátní vůči úplně všem ID v celém dokumentu). Element díky atributu typu ID může získat jednoznačný identifikátor mezi všemi ostatními elementy. Poznámka: Metoda objektu XML dokumentu DOM umožňuje přístup k elementu přes tento identifikátor. Příklad: elementy kniha budou mít atribut typu ID s názvem kniha_ID Atribut deklarovaný jako IDREF nebo IDREFS Atribut deklarovaný jako IDREF musí obsahovat jednu z hodnot atributů, který byl deklarován jako ID kdekoliv jinde. IDREF tedy zprostředkovává odkaz na jeden z elementů pomocí hodnoty atributu typu ID. V HTML je tento přístup podobný pomocí odkazu názvu elementu A tj. atributu name. Viz příklad 5.
17
základy xml autor: Ilja Kraval
strana 18/34
Pokud je deklarován atribut jako IDREFS, může obsahovat několik odkazů oddělených mezerou. Poznámka: DTD takto umožňuje v dokumentu zavádět vazby mezi elementy a to jedna k jedné (ID a IDREF) a jedna ku N (ID a IDREFS).Význam ID a IDREF je podobný jako je použití systémového klíče ID ve vazbách v tabulkách, pouze se chápe,jako jednostranný vztah (IDREF „ukazuje“ hodnotou na element, který má ID s hodnotou IDREF) Příklad: V atributu knihy nakladatel_id musí být umístěn nějaké ID deklarované jinde (v tomto případě bude mít nakladatel své ID a daná kniha má jeho ID přes IDREF). Atribut deklarovaný jako ENTITY nebo ENTITIES Hodnota atributu typu ENTITY musí být jedna z deklarovaných v tzv. ENTITY deklaraci - tato deklarace viz dále. Tímto se váže daný ELEMENT k dané ENTITY, resp. několika ENTITIES (oddělovačem u několika ENTITIES je mezera). Atribut deklarovaný jako NMTOKEN nebo NMTOKENS Atribut takto deklarovaný má hodnotu stringu, ale jeho možná hodnota je omezena na jednoduché slovo. Atribut deklarovaný jako seznam možných hodnot Deklarace obsahuje seznam možných hodnot atributu a případně implicitní hodnotu. Seznam možných hodnot se umisťuje za název atributu do závorky, oddělovačem je svislice |. Případná implicitní hodnota se umístí za závorku do uvozovek: Příklad Implicitní nastavení atributů Existují čtyři možné default nastavení pro vlastnosti atributu: #REQUIRED - atribut musí mít přiřazenu hodnotu v dokumentu, není přípustný stav „nezadán“ #IMPLIED - atribut není vyžadován a také nemá default hodnotu #FIXED “hodnota” - atribut není sice vyžadován, avšak pokud se vyskytne, musí mít konstantní hodnotu.
Deklarace ENTITY Deklarace ENTITY umožňuje propojit určitý název s určitou nějakou jinou obsahovou částí. Touto obsahovou částí může být Kousek textu Kousek DTD deklarace Jiný externí soubor obsahující text nebo binární data Existují tří druhy ENTITY
18
základy xml autor: Ilja Kraval
strana 19/34
Interní entity Interní entity umožňují provést odkaz na určitý text: umožňuje kdekoliv použít odkaz pomocí &OBJECON; a na toto místo dojde k dosazení hodnoty textu Object Consulting Externí entity Externí entity značí odkaz na externí soubor obsahující buď text anebo binární data. Syntaxe je Pokud zdroj (soubor) obsahuje text a část deklarace NDATA se nevyskytuje, potom dojde k dosazení tohoto textu na místo odkazu. Takto lze jednoduchým způsobem sdílet části XML dokumentů (obdoba include). Pokud zdroj obsahuje binární data, potom v části NDATA je deklarována informace o typu dat (bude pojednáno dále). Důležité je, že název ENTITY s binárním zdrojem se může použít pouze přes odkaz tj. jako hodnota atributu typu ENTITY (viz kapitola atribut deklarovaný jako ENTITY). Parametrické entity Existuje ještě možnost sdílení deklarací pomocí tzv. parametrických entit. Syntaxe pro zavedení parametrické entity je pomocí znaku %:
...>
Pokud zavedeme takto parametrickou entitu, můžeme element deklarovat pomocí parametrické entity, tj. odkázat se na ni v deklaraci takto: a tím využít již hotové deklarace. Několik různých elementů s různými názvy může být deklarováno pomocí jedné parametrické entity (mají až na název stejnou deklaraci).
Deklarace NOTATION Deklarace NOTATION slouží k identifikaci speciálních typů externích binárních souborů. Syntaxe Podobně jako u binární entity, kde název této entity mohl vystupovat v referenci přes atribut, také zde se název daného notation objeví jako hodnota některého z atributu typu NOTATION. Příklad:
19
základy xml autor: Ilja Kraval
strana 20/34
Popis příkladu - je deklarováno že existuje element logo a je prázdným že existují typ binárních dat gif a jpg že element logo bude mít atributy img typu ENTITY a atribut format typu NOTATION a že nakonec existuje ENTITY obr.gif se zdrojem (souborem) na cestě http://...gif a v implementaci v XML dokumentu konkrétně vyhovuje takovýto element:
Poznámka: Příklad je pro vysvětlení názorný, je třeba si uvědomit, že takto zaveden je vztah mezi logem, názvem obrázku, zdrojem v konečné implementaci je takříkajíc „natvrdo“
Namespaces Uveďme si příklad, který objasňuje nutnost zavést tzv. namespaces: V jednom XML dokumentu se objeví následující část dokumentu:
Základy OOP ... a v druhém XML dokumentu
RNDr. ... Je zřejmá kolize v chápání různých elementů které však mají stejný název - titul. Pokud bychom sloučili informace z těchto dvou dokumentů, nastala by kolize. Je zřejmé, že pokud by oba dokumenty psala tatáž osoba resp. kolegové ze stejného týmu, potom by se této kolizi dalo vyvarovat. Je nemožné se však takto vyvarovat této kolizi na Internetu - nelze totiž dopředu předjímat kdo a kdy jaké elementy použije. Řešení tohoto problému spočívá v zavedení tzv. namespaces a ty souvisí s pojmem URI - Uniform Resource Identifiers.
20
základy xml autor: Ilja Kraval
strana 21/34
URI - Uniform Resource Identifiers Problém s možnou kolizí elementů od různých zdrojů se řeší zavedením tzv. namespaces, které využívají URI Uniform Resource Identifiers. URI jsou definovány jako jednoznačné identifikátory jakýchkoliv objektů (útvarů apod.) na Internetu. Není specifikováno přesně, co má vlastně obsahovat URI, ale požadavku na jednoznačnost se většinou dosahuje pomocí názvů URL, které jsou jednoznačné. Například jako autor těchto skript bych mohl zvolit jednoznačné URI URI = “www.objects.cz“ A z něj odvodit URI pro tuto knihu URI = „www.objects.cz/skriptaXML“
Namespaces v XML Namespaces se používají v dokumentu právě pomocí URI. Pokud každému elementu přiřadíme navíc předponu ve tvaru URI, dostaneme tak jednoznačně definovaný element. Pokud někdo jiný použije stejný název elementu, avšak s jinou předponou namespaces, nedojde ke kolizi. Syntaxe pro zavedení namespaces: V root elementu se definují použité namespaces pomocí zkratky xmlns a poté se tato předpona použije při zavádění elementů:
xmlns:predpona1=“...URI...“ xmlns:predpona2=“...URI...“ xmlns:predpona3=“...URI...“>
<predpona1:element ...>... <predpona2:element ...>... <predpona3:element ...>... ... Pokud se použije namespaces bez udání názvu předpony, tj.: xmlns=“...URI...“ potom se jedná o implicitní hodnotu namespaces a každý element bez předpony bude mít automaticky toto namespaces, aniž by se explicitně udávalo u daného elementu, např. v následujícím příkladu element s názvem element1 patří k namespaces URI1:
xmlns:“...URI1...“ xmlns:predpona2=“...URI...“ xmlns:predpona3=“...URI...“>
<element1 ...>... <predpona2:element ...>... <predpona3:element ...>...
21
základy xml autor: Ilja Kraval
strana 22/34
...
XML Document Object Model - DOM DHTML DOM a XML DOM Existuje tzv. Document object model pro HTML (např. v MS technologiích nazývaný DOM IE). Tento DOM je objektovým modelem DHTML a jeho použití umožňuje „natáhnout“ informace stránky v HTML kódu do odpovídajících objektů. Poté lze voláním metod těchto objektů například ve skriptu vloženém do stránky ovládat dynamicky prvky HTML stránky. Příklad (viz příklad 6 -stránka priklad6_0.htm ) <TITLE>
Příklad na DHTML DOM v IE 5
<SCRIPT> msg.innerText = 'MSGBOX: ' + 'id of parent of child2 = ' + oChild2.parentNode.id + ', view source code'
22
základy xml autor: Ilja Kraval
strana 23/34
Pomocí property ParentNode a property id je vypsán parent prvek v HTML kódu ve skriptu, který je spuštěn ihned při loadu stránky. Oproti tomu XML DOM je obecný objektový model XML dokumentu. Jeho použití je velmi podobné jako je použití DHTML DOM, ale je specifický pro XML. V HTML kódu lze pomocí skriptu vytvořit instanci parseru XML, který je vrcholovou instancí zpřístupňující XML strukturu XML Document Object Modelu a pomocí tohoto objektu zpracovat XML dokument. Viz příklad 6. Soubory příklady 6_1 a 6_2: V prvém příkladě se zjistí chyba zpracování a napíše se její důvod, v druhém případě se pomocí XML DOM vypíše root element XML dokumentu - jeho text a typ.
Základní objekty XML DOM Jak chápat objektový model a zpřístupněné interfacy jádra XML DOM Budeme dále hovořit o tzv. objektech XML DOM. Je třeba si uvědomit, že existuje několik možných dodavatelů aplikace XML DOM parseru (např. MS), tj. následující kapitoly jsou o dohodě, co musí takováto objektová aplikace zpřístupnit uživateli aplikace. Jedná se vlastně o zpřístupnění volání metod jádra XML DOM přes publikované dohodnuté interfacy. Z hlediska objektového modelování můžeme hovořit o objektech, protože interfacy jsou protokoly zpráv těchto objektů (viz kapitola o OOP). Jednoduše řečeno, je třeba si uvědomit existující zobecnění následujících dohod o objektech vzhledem k různým dodavatelům prostředků pro práci s XML DOM.
Výčet základních objektů XML DOM Existují tyto základní objekty XML DOM XMLDOMDocument objekt XMLDOMNode objekt XMLDOMNodeList objekt XMLDOMNamedNodeMap objekt
XMLDOMDocument objekt Objekt nabízí metody a property pro procházení, dotazování a změny v XML dokumentu.
Nová instance objektu XMLDOMDocument Vytvoření nové instance objektu v jazyku JavaScript: var mydoc = new ActiveXObject(“Microsoft.XMLDOM”) a v jazyku VBScript: mydoc = CreateObject (“Microsoft.XMLDOM”)
23
základy xml autor: Ilja Kraval
strana 24/34
metody Load a Save XMLDOMDocument Metody .load(string), .save(string) Vstupním parametrem metody je XML soubor identifikován buď cestou, URL, anebo jako Request objekt (posláno na server pomocí XMLHTTP, viz dále)
Metody .loadXML(string) .saveXML(string) vstupním parametrem je string ve tvaru XML sekvence, např. .loadXML(“<customers>...”) Pomocí property documentNode lze přiřadit již existující objekt typu XMLDOMNode a tím celý strom v hierarchii XML: .documentNode = my_XMLNode
Parsovací flagy objektu XMLDOMDocument Objekt umožňuje nastavit některé vlastnosti související se způsobem parsování. .async - zda se má provést load dokumentu asynchronně. Pokud ano, potom se při loadování vytváří samostatná niť zpracování parseru .validateOnParse - zda bude dokument validován, pokud false, pouze se kontroluje, zda je well-formed .resolveExternals - zda jsou povoleny externí dokumenty (např. DTD) preserveWhiteSpace zda jsou prázdné znaky - mezery zachovány (default “false“).
XMLDOMDocument a informace o dokumentu .doctype vrací objekt typu XMLDOMDocumentType (viz DTD - ekvivalent ). .implementation vrací objekt XMLDOMImplementation - pouze pro získání informace o verzi a typu formou dotazu - XMLDOMImplementation.hasfeature(feature, version) .parseError - poslední chyba, má další informace - vrací XMLDOMParseError objekt .readyState - stav parsování v průběhu (async = true), viz příklad 7 .url - string - URL posledního nataženého dokumentu
XMLDOMDocument a výběr node .documentElement vrací objekt typu XMLDOCNode - root dokumentu
24
základy xml autor: Ilja Kraval
strana 25/34
.nodeFromId vrací element Node podle Id definovaného v DTD nebo XML schéma. ID musí být unikátní v celém XML. Vstupní parametr id musí být unikátní vzhledem ke všem id (viz atribut typu id v DTDT kapitole) .getElementsByTagName vrací kolekci node podle daného Tag-Name XMLDOMDocument a jak tvořit nové prvky XML dokumentu Existují dva možné způsoby, jak vytvořit pomocí objektu XMLDOMDocument nový prvek XML dokumentu 1. Zavolá se metoda createNode, kde vstupním parametrem je požadovaný typ prvku, název a URI pro namespace 2. Zavolá se metoda specielně určená pro tvorbu prvku daného typu (celkem 8 metod podle 8 typů prvků) Výčet těchto metod je následující createAttribute createCDATASection createComment createDocumentFragment createElement createEntityReference createProcessingInstruction createTextNode Každá z těchto metod vrací objekt daného typu, který se má vytvořit. Samotné zavolání těchto metod (resp. ekvivalentně createNode s parametrem typu) nezpůsobí vytvoření prvku v dokumentu, ale „mimo něj“. Teprve až zavolání metody pro přidání prvku do dokumentu se vstupním parametrem tohoto prvku (např. MyNode.AppendChild) způsobí jeho zařazení do dokumentu.
Objekt XMLDOMNode Jak získat property a kolekce objektu Skupina property vracející informace o prvku XML: attributes - vrací kolekci všech atributů typu XMLDOMNamedNodeMap hasChildNodes - boolean, vrací true, pokud node má podřízené node namespaceURI - string, read-only. Vrací namespace daného prvku nodeName - název prvku nodeType - typ prvku, jedna z možných hodnot výčtu číselných konstant nodeTypeString - typ prvku jedna z možných hodnot výčtu string konstant parsed - true, pokud jsou Node a všechny jeho podřízené Node rozparsovány (extense proti W3C) specified - vrací false, pokud jeho hodnota byla dána z DTD, true pokud byla specifikována přímo v Node XML dokumentu (extense proti W3C)
25
základy xml autor: Ilja Kraval
strana 26/34
xml (příklad 8), LoadXML(Node.xml) (extense proti W3C)
Jak získat hodnotu XMLDOMNode Tato property zpřístupní text daného node: .text .nodevalue .nodeTypedValue (spolu s tzv. XML Schema) O jaký typ a tedy jaký je typ obsah textu závisí na hodnotě property nodeType. První možností, jak získat nebo změnit text daného Node je pomocí property text typu string: strValue = oXMLDOMNode.text objXMLDOMNode.text = strValue Druhou možností je použít property nodeValue. V tom případě je návratovou hodnotou typ variant. Třetí možností (není obsahem standardu W3C) je použít .nodeTypedValue (spolu s tzv. XML Schema). Jak procházet stromem XML pomocí metod a property objektu XMLDOMNode Skupina metod a property umožňuje vyjít z daného XMLDOMNode a přejít k dalším prvkům XML dokumentu: parentNode - vrací nadřízený prvek childNodes - vrací kolekci podřízených prvků firstChild - vrací první podřízený prvek lastChild - vrací poslední podřízený prvek previousSibling - vrací předešlého souseda na téže úrovni prvků nextSibling - vrací následného souseda na téže úrovni prvků ownerDocument - vrací root element celého dokumentu poznámka - pouze pro XSL technologii: selectNode, selectNodes - vrací kolekci podřízených prvků vyhovujících dané vstupní podmínce XSL masky Jak pracovat s podřízenými prvky XMLDOMNode Metody pro manipulaci s podřízenými prvky daného XMLDOM Node: appendChild
- přidá podřízený prvek
replaceChild - vymění podřízený prvek removeChild - odstraní podřízený prvek insertBefore - přidá „před“ daný prvek
26
základy xml autor: Ilja Kraval
transformNode vrací string
strana 27/34
- zpracuje daný prvek a podřízené prvky podle vstupního XSL stylesheet,
transformNodeToObject (pro XSL) - zpracuje daný prvek a podřízené prvky podle vstupního XSL stylesheet, vrací objekt
Objekt XMLDOMNodeList Objekt je určen pro práci s kolekcí prvků Node, kolekce je výsledkem metod childNodes, selectNodes, getElementsByTagName. Jak pracovat s kolekcí Node objektů Metody slouží pro získání informace resp. navigaci uvnitř kolekce: length - vrací počet prvků item(i) - (iterace začíná nulou) vrací aktuální i-tý prvek nextNode - vrací další prvek (extense proti W3C)
Objekt XMLDOMNamedNodeMap Objekt je kolekcí, která je navrácena jako attributes property prvku Node. getnamedItem - vrací atribut specifického názvu getQualifiedItem - vrací atribut specifického namespace a názvu item - vrací aktuální prvek length - vrací počet nextNode - vrací příští prvek (extenze proti W3C) removeNamedItem - odstraní specifikovaný prvek podle názvu removeQualifiedItem - odstraní specifikovaný prvek podle namepsace a názvu reset - vyresetuje iterator výčtu prvků (extenze proti W3C) setNamedItem - přidá prvek do kolekce (kolekce je živá, takž se to ihned projeví v naplnění objektového modelu XML DOM dokumentu)
Transformace XML dokumentů pomocí XSL XSL je zkratkou pro Extensible StyleSheet Language (viz odkaz Extensible Style Language (XSL)). Pro použití v XML technologii existují základní dvě oblasti pro XSL technologii, která se neustále rozvíjí: Transformace XML dokumentů Slovník XML pro formátování sémantiky
Transformace XML dokumentů Budeme se věnovat praktickému použití prvního bodu - transformace XML dokumentů pomocí XSL. Tato technologie transformace XML dokumentů má vcelku nové a velmi praktické několikeré užití v Internetovských technologiích.
27
základy xml autor: Ilja Kraval
strana 28/34
Poznámka: Znovu podotýkáme, že tato skripta jsou zaměřena na MS technologie, v této kapitole se to objevuje obzvlášť, např. už proto, že se vyžaduje v mnoha případech použití IE5.
XSL a jeho použití pro transformace dokumentů • Jeden ze základních pojmů - použití XSL pro transformaci dokumentů: Může být HTML, XML, report apod.
strom dokument
XSL dokument
nový strom dokument
obrázek 7 Jedno z možných použití XSL - transformace XML dokumentů
K čemu může sloužit transformace XML dokumentu Umožňuje zobrazit XML dokument pomocí HTML (viz příklad 10 - i se sortem) Převod dokumentů pro nízko-úrovňové browsery Umožňuje vytvořit „všeobecný výpis“ z XML dokumentu Umožňuje sortování, filtrování atd. nad XML dokumentem Umožňuje vytvořit XML dokument z jiného XML dokumentu a to i nový XML generovaný programově, změní například i datové struktury atd. K transformaci XML dokumentu pomocí XSL viz příklad 11, kde se atributy barvy mění na podřízené elementy. Pro použití XSL technologie je třeba znát její syntaxi (viz například zmíněné stránky na Internetu organizace W3C anebo v MS technologii viz MSDN).
Co je to XML Schema XML Schema je alternativou k DTD a je zavedena firmou MS. Tato technologie jako „definice typů“ nemá svůj obraz v doporučeních W3C, kde se používá DTD, což je nevýhodou XML Schema. Na druhé straně XML Schema má z hlediska technologického oproti DTD své nesporné výhody. Jednou z těchto výhod je „přísná syntaxe“ XML v dokumentu přímo v XML Schema. Jednoduše řečeno - XML Schema je well-formed XML dokument. Další výhodou je extensibilita XML Schema a možnost zavádění datových prvků, které nelze v DTDT zavést.
28
základy xml autor: Ilja Kraval
strana 29/34
XML Schema používá několika rezervovaných názvů elementů XML pro definici typů prvků. Jako příklad si uveďme následující schéma. Všimněte si, že se jedná o XML dokument bez zavedení DTD, který má deklarované typy pomocí části well-formed dokumentu XML: <Schema xmlns="schemas-microsoft-com:xml-data"> <ElementType name="title" /> <ElementType name="author" /> <ElementType name="pages" /> <ElementType name="book" model="closed"> <element type="title" /> <element type="author" /> <element type="pages" />
Všimněte si na příkladu elementu <Schema>, zejména kde začíná a kde končí, zavedení namespace v tomto elementu, definičního elementu <ElementType> s atributem identifikátoru name vztahu mezi podřízenými typy (kdo koho jako typ obsahuje) pomocí vnoření elementu <element> s uvedením typu, který je souhlasný s názvem name v předešlé definici <ElementType> zavedení typů atributů a kam patří podle stejného vzoru, jako jsou zavedeny elementy Poznámka autora skript: XML Schema se jeví z hlediska XML logičtější a možná i elegantnější (dá se chápat jeho podstata intuitivně podle zavedeného vzoru odpovídající XML) , avšak není standardem.
Přenos dat XML v Internetovských technologíích MS Databinding XML Technologie databinding není v MS novinkou, pouze se převádí její důsledky také do oblasti XML. Základem databindignu je obecně provázání objektu - tj. určitého prvku (např. GUI objektu, objektu z business logiky) s datovým zdrojem. Datový zdroj je různého typu (SQL databáze, file system apod.) a nyní takovýmto typem zdroje může být také XML dokument: Příklad pro část HTML kódu, kde dojde k databindingu mezi XML dokumentem jako zdrojem a HTML tabulkou: ...
29
základy xml autor: Ilja Kraval
strana 30/34
<XML ID=xmlDoc src=“soubor.xml"> ... <SPAN DATAFLD=“..."> | ...
... Konstrukce je zřejmá - prvek XML s identifikátorem xmlDoc má svá data umístěna v souboru soubop.xml a tabulka provádí databinding přes identifikátor zdroje - DATASRSC, v každém poli umisťuje hodnotu odpovídající DATAFLD. Funguje to pro každý prvek DHTML , který podporuje DATASRC a DATAFLD, což jsou základní prvky databindingu (viz MSDN).
DataIslands v XML Pomocí technologie DataIslands lze v DHTML (MS technologie) vložit přímo prvek XML s vlastním atributem - identifikátorem do HTML kódu a přes tento identifikátor se na tento objekt odvolávat jako na každý jiný objekt HTML stránky (stejně jako na DIV, TABLE apod.) <XML ID=“MyID”> XML dokument.... v DOM HTML stránky se na ně lze odkazovat jako na objekt přes ID a metodu XMLDocument Pokud použijeme u prvku <XML> atribut SRC, můžeme se odvolat na externí dokument XML. viz příklad 9: Do HTML kódu je umístěn DataIsland XML s identifikátorem ID barvicky: <XML ID="barvicky">
30
základy xml autor: Ilja Kraval
strana 31/34
V kódu procedury, která se vyvolá stlačením buttonu, se nachází pouze zobrazení do Msgboxu struktury XML souboru. Stejně tak lze umístit data XML mimo HTML kód do externího souboru a zavést atribut SRC.
HTTP a XML, scénáře složitých HTTP rozhovorů klient-server Dalším zajímavým prvkem přenosu dat je přenos dat v HTTP pomocí Request objektu a HTTP Response objektu s použitím XML. Pro použití této technologie se musí vytvořit objekt Microsoft.XMLHTTP a volat jeho metody. Princip je následující: Vytvoří se dataisland v HTML kódu <XML ID=...>, který reprezentuje přenášenou větu. Klient tuto větu nějak naplní, například pomocí formuláře