Az XML dokumentumok adatmodellje dr. Kovács László XML dokumentumok reprezentációs formái Az XML dokumentumok egyik érdekessége, hogy többarcúak, különböző megközelítésből más és más alakban jellennek meg. Alapesetben az XML dokumentum egy megfelő jelölő szavakat tartalmazó szöveges állomány. Ez alapvetően igaz is, de az XML dokumentumok feldolgozása során a különböző feldolgozó programok más és más részt tartanak fontosnak a dokumentumból. Nézzük sorra, milyen nézetei is vannak az XML dokumentumoknak. Vegyünk egy induló XML dokumentumot, melynek tartalma a következő: <?xml version="1.0"?> <!DOCTYPE SYSTEM "a.dtd"> <x:kerdes xmlns:x="a.h"> Hello ! </x:kerdes> Az XML dokumentum azon arcát, amit a szövegszerkesztővel láthatunk, nevezzük el primér XML dokumentumnak. Az így látott kép azonban szükségszerűen különbözik a tényleges, felolgozandó tartalomtó, hiszen vannak benne olyan jelek, mint például a  melyek egy másik jelnek,egy karakternek a pótlására, jelölésére szolgál. A dokumentum ezen nézetét szekundér XML dokumentumnak nevezhetjük. A minta primér dokumentumhoz a következő szekundér dokumentum lehet rendelni: <?xml version="1.0"?> <!DOCTYPE SYSTEM "a.dtd" > <x:kerdes xmlns:x="a.h"> 1
Hello a! </x:kerdes> A dokumentum értelmezés következő szintje a tartalom értelmezési módjához kapcsolódik. A dokumentum fizikai oldala azt adja meg, hogy a dokumentum mely állományokból, forrásokból épül fel. A példánkban az DTD definícióhoz és a  jel értelmezéséhez kell külön egységhez fordulni. A dokumentumot felépítő tárolási egységeket nevezik egyednek (entity). <?xml version="1.0"?> <!DOCTYPE kerdes [ <!ELEMENT kerdes (#PCDATA) > ]> <x:kerdes xmlns:x="a.h"> Hello a! </x:kerdes> A fizikai vetület mellett a dokumentumhoz logikai vetület is rendelhető. A logikai vetület a dokumetumot alkotó jelölő elemeket és azok viszonyát mutatja. Az elemek egymásba ágyazottak lehetnek és rendelkezhetnek elemjellemzőkkel. A elemekre épülő logikai modellben nem szerepelnek olyan fontos részletek, mint például a névterek használata. A dokumentum teljas tartalmának lefedésére egy kibővített logikai modell szükséges, mely szintén a megismert hierarchia struktúrára épül. Az elkészített XML feldolgozók alapvetően, néhány kivételtől eltekintve fát építenek fel a dokumentumból. A faszerkezethez egy illeszkedő művelethalmaz és tulajdonsághalmaz társul, amely meghatározza a dokumentum kezelésének jellegét. A faszerkezet szerepének fontosságát jól mutatja az a tény, hogy a W3C konzorcium szabványosította az XML-t belsőleg leíró fa struktúráját, ahol a szabvány a fa elemeinek ábrázolását öleli fel. Az egyik kapcsolódó szabvány az XML információs készlet modellje (XML Information Set, 2004) és a XDM adatmodell (Xquery and XPath Data Model, XDM, 2007). Ebben a fejezetben ezen modelleket tekintjük át. Az Infoset leírás elsődleges célja, hogy megadja az XML feldolgozó programok számára az XML dokumentumokban tárolt információk 2
az XML fa szerkezetére illeszkedő struktúráját. Az Infoset egy absztrakt leírással adja meg az XML dokumentumok legfontosabbnak tartott információ elemeit. Azonban az Infoset modell sem terjed ki minden részletre, hiszen többek között nincs külön információs csomópont a DTD egyes elemire, az elemjellemzők sorrendjére. A modell az XML feldolgozók elemzési feladataira koncentrál, s figyelmen kívül hagyja, ami más feldolgozó, pl. a DTD feldolgozó feladata. A feldolgozás során a primér reprezentációs formából kiindulva halad a feldolgozás a belső dokumentum-fa reprezentáció felé. A feldolgozás eredményeként előálló XML dokumentumot viszont újra a felhasználó által megszokott és értelmezhető formába, a primér reprezentációba kell hozni. Emiatt szükség van a belső formátumok primér formátumra alakítására is. A belső formátumról a külső szöveges alakra történő konverziót végző egységet szerializáló(serialization) modulnak nevezzük. A XML dokumentum különböző reprezentációs formái közötti kapcsolatokat összesítve mutatja be az alábbi ábra. primér secunder (infoset) dokumentum-fa primér [megjelenítő] [elő-feldolgozó] [feldolgozó] [serializer] Infoset modell A belső XML fastruktúra leírásának induló és absztraktabb modellje az Infoset, XML Information Set modell. A modell definiálja a fa csomópont típusait, és a csomópontok legfontosabb jellemzőit. A modellben a dokumenmtumot reprezentáló teljes fát nevezik információs készletnek (information set, vagy rövidítve inofset), s a fát alkotó komponenseket, csomópontokat információs elemeknek (information item) nevezik. Az infoset fa modellje azonban nem tekinthető az egyedüli XML fa modellnek. A későbbi XML feldolgozó felületek, mint például a DOM vagy XPath szabványok által használt fa struktúrák bizonyos elemekben eltérő fa modellt használnak. Ahogy már azt korábban láthattuk, az XML fában különböző típusú csomópontok szerepelhetnek, melyek eltérő szerkezettel rendelkeznek. A Infoset modellben ennek megfelelően több information item típus létezik. A modell tizenegy information item típust definiál: dokumentum egység (az XML fa gyökere) 3
jelölőelem egység (element) elemjellemző (attribute) feldolgozási utasítás (processing instruction) egyedhivatkozás (entity reference) formátumjelölő (notation) karakter egység (character) megjegyzés (comment) DTD egység (dokumentum séma szerkezete) névtér egység (namespace) nem-elemzendő egyed (unparsed entity) Az egyes egységtípusok közötti legfontosabb különbség a egységet leíró jellemzőkben rejlik. A modell minden egségtípusra megadja az értelmezett tulajdonságok körét. A legtöbb leíró tulajdonsággal a dokumentum és a jelölőelem rendelkezik. A másik végen, a legegyszerűbb típusok közé tartozik többek között a megjegyzés és a névtér is. A dokumentum egység tulajdonságai: gyermek információs elemek listája (children), a lehetséges csomópont típusok listája: jelölőelem, feldolgozási utasítás, megjegyzés és DTDegység. dokumentum gyökér eleme (document element) formátum jelölés (notation) : a DTD-ben definiált NOTATION elemeket adja meg nem-elemzendő egyedek (unparsed entity): a beépített és a DTD-ben megadott ENTITY definíciókat tartalmazza dokumentum URI azonosítója (base URI) karakter kódolási szabvány (character encoding schema) XML verziója (version) önálló dokumentum-e (standalone) 4
A jelölőelem tulajdonságai: lokális neve (local name) névtér (namespace name) a név előtagja (prefix) gyermek információs elemek listája (children), a lehetséges típusok listája: elem, feldolgozási utasítás, egyedhivatkozás, karakter és megjegyzés. elemjellemzők listája (attributes) itt definiált névterek listája (namespace attributes) érvényes névterek listája (in-scope namespaces) szülő elem (parent) elem URI azonosítója (base URI) Az elemjellemző csomópont tulajdonságai: lokális neve (local name) névtér (namespace name) a név előtagja (prefix) értéke (normalized value) explicit szerepelt-e az érték (specified) jellemző típusa, pl. IDREF, ENTITY (attribute type) hivatkozott értékek listája (references) szülő elem (owner element) A feldolgozási utasítás jellemzői: feldolgozó (target) utasítás (content) URI érték (base URI) jelmagyarázat (notation) 5
szülő csomópont (parent) Egy nem kifejtett egyedhivatkozási csomópont: hivatkozott egyed neve (name) külső hivatkozás (system identifier) nyilvános hivatkozás (public identifier) elérés azonosító (base URI) szülő csomópont (parent) Karakter leíró csomópont karakter kódja (character code) szóköz jelző (element contetnt whitespace) szülő csomópont (parent) Megjegyzés leíró: tartalom (content) szülő csomóont (parent) DTD-t leíró csomópont: külső hivatkozás (system identifier) nyilvános hivatkozás (public identifier) tartalmazott csomópontok (children) csomópont (parent) Fel nem oldott egyed csomópontja: egyed neve (name) külső hivatkozás (system identifier) nyilvános hivatkozás (public identifier) elérés azonosító (base URI) 6
jelmagyarázat (notation) A formátum jelölő csomópont jellemzői: azonosító név (name) külső hivatkozás (system identifier) nyilvános hivatkozás (public identifier) elérés azonosító (base URI) Névtércsomópont jellemzői: előtag (prefix) érték (namespace name) Az infoset modell bemutatására vegyük az alábbi XML állományt: <?xml version="1.0"?> <!-- mintapélda --> <!DOCTYPE konyvek SYSTEM "x//pp//ktar" [ <!-- struktúra --> <!NOTATION cl SYSTEM "x//pp//claus"> <!ELEMENT konyvek (konyv*) > <!ELEMENT konyv (#PCDATA) > <!ATTLIST konyv isbn CDATA #REQUIRED> <!ENTITY me SYSTEM "x//pp/me" NDATA c1 > ]> <!-- adatresz --> <?me mod="rule"?> <m:konyvtar xmlns:m="a.a" > <konyv isbn="i1"> A & <![CDATA[x>y]]> </konyv> </m:konyvtar> 7
Az infoset modell legfontosabb eleme a dokumnetum egység, ami összefogja az XML dokumentumot. A gyermek csomópontok között nem szerepel az első xml verziót megadó feldolgozási utasítás. A dokumentumban az alábbi gyerekcsomópontok szerelnek: Egy megjegyzés csomópont (meg-1): <!-- mintapélda --> Egy DTD leíró comópont (dtd-1): <!DOCTYPE konyvek SYSTEM "x//pp//ktar" [ <!-- struktúra --> <!NOTATION cl SYSTEM "x//pp//claus"> <!ELEMENT konyvek (konyv*) > <!ELEMENT konyv (#PCDATA) > <!ATTLIST konyv isbn CDATA #REQUIRED> <!ENTITY me SYSTEM "x//pp/me" NDATA c1 > ]> Egy további megjegyzés csomópont (meg-2): <!-- adatresz --> Feldolgozási utasítás csomópont (pi-1): <?me mod="rule"?> Gyökér elem csomópont (ele-1): <m:konyvtar xmlns:m="a.a" > <konyv isbn="i1"> A & <![CDATA[x>y]]> </konyv> </m:konyvtar> A további tulajdonságokat az alábbi lista adja meg: csomópont típusa: dokumentum csomópont azonosító: dok-1 gyermek információs elemek listája: (meg-1, dtd-1, meg-2,pi-1, ele-1) dokumentum gyökér eleme: ele-1 formátum jelölések: not-1 8
nem-elemzendő egyedek: (ent-1, ent-quot, ent-apos, ent-amp, ent-gt, ent-lt) dokumentum URI azonosítója: file://a.a XML verziója: 1.0 önálló dokumentum-e : nem A megjegyzéseket leíró információs csomópontok igen egyszerű szerkezetűek: csomópont típusa: megjegyzés csomópont azonosító: meg-1 tartalom: mintapélda szülő: dok-1 csomópont típusa: megjegyzés csomópont azonosító: meg-2 tartalom: adatresz szülő: dok-1 A DTD-t leíró csomópont felépítése: csomópont típusa: DTD leíró csomópont azonosító: dtd-1 külső hivatkozás: x/p/ktar nyilvános hivatkozás: tartalmazott csomópontok: meg-3 szülő csomópont: dok-1 A DTD-ben foglalt részek közül csak a megjegyzés és felodolgozási utasítások részt emeli ki. A befoglalt megjegyzés csomópont tartalma: csomópont típusa: megjegyzés csomópont azonosító: meg-3 9
tartalom: struktura szülő: dtd-1 A feldoglozási utasítás leírása: csomópont típusa: feldolgozási utasítás csomópont azonosító: pi-1 feldolgozó: me utasítás: mod= rule URI érték: file://a.a jelmagyarázat: szülő csomópont: dok-1 A gyökérelemnél a tartalmát leíró részben karakter-egyed szintig kerül lobontásra a struktúra. A gyökérelem leírása: csomópont típusa: jelölőelem csomópont azonosító: ele-1 lokális neve: konyvtar névtér: a.a a név előtagja: m gyermek információs elemek listája: (kar-1, kar-2, ele-2, kar-3, kar-4) elemjellemzők listája: itt definiált névterek listája: jel-1 érvényes névterek listája: nms-1 szülő elem: dok-1 elem URI azonosítója: file://a.a A karakterek megadása: 10
csomópont azonosító: kar-1 kód: 10 szóköz-jelző: hamis szülő: ele-1 csomópont azonosító: kar-2 kód: 32 szóköz-jelző: igaz szülő: ele-1 A befoglalt konyv elem szerkezete: csomópont típusa: jelölőelem csomópont azonosító: ele-2 lokális neve: konyv névtér: a név előtagja: gyermek információs elemek listája: (kar-5, kar-6, kar-7, kar-8, kar-9, kar-10, kar-11, kar-12, kar-13, kar-14, kar-15, kar-16) elemjellemzők listája: jel-1 itt definiált névterek listája: érvényes névterek listája: nms-1 szülő elem: ele-1 elem URI azonosítója: file://a.a csomópont azonosító: kar-3 11
kód: 10 szóköz-jelző: hamis szülő: ele-1 csomópont azonosító: kar-4 kód: 32 szóköz-jelző: igaz szülő: ele-1 A névtér csomópont felépítése: csomópont típusa: névtér csomópont azonosító: nms-1 előtag: m érték: a.a csomópont típusa: elemjellemző csomópont azonosító: jel-1 lokális neve: m névtér: a név előtagja: értéke : i1 explicit szerepelt-e az érték: igaz jellemző típusa: CDATA hivatkozott értékek listája: szülő elem: ele-2 A konyv elem tartalmát leíró karakter egyedek adatai: 12
csomópont azonosító: kar-5 kód: 10 szóköz-jelző: hamis szülő: ele-2 csomópont azonosító: kar-6 kód: 32 szóköz-jelző: igaz szülő: ele-2 csomópont azonosító: kar-7 kód: A szóköz-jelző: hamis szülő: ele-2 csomópont azonosító: kar-8 kód: 32 szóköz-jelző: igaz szülő: ele-2 csomópont azonosító: kar-9 kód: & szóköz-jelző: hamis 13
szülő: ele-2 csomópont azonosító: kar-10 kód: 32 szóköz-jelző: igaz szülő: ele-2 csomópont azonosító: kar-11 kód: x szóköz-jelző: hamis szülő: ele-2 csomópont azonosító: kar-12 kód: szóköz-jelző: hamis szülő: ele-2 csomópont azonosító: kar-13 kód: y szóköz-jelző: hamis szülő: ele-2 csomópont azonosító: kar-14 kód: 10 14
szóköz-jelző: hamis szülő: ele-2 csomópont azonosító: kar-15 kód: 32 szóköz-jelző: igaz szülő: ele-2 Az Infoset modell tehát egy olyan absztrakt modell, melyben a megszokott jelölőelem szintaktika (a kacsacsőr zárójelek) nem szerepelnek, az egyedek tárolási formátuma, kerete szabadon módosítható. Az Infoset a dokumentum feldolgozás lelkét jelentő struktúráltságot írja le. Az Infoset szerepét jól szemlélteti Gudgin megállapítása: XML started as a markup language, but it has eveloped into a platform, the heart of which is not XML 1.0, but the XML Infoset.(Az XML jelölő nyelvként jött létre, de ma már külön platformként jelenik meg, melynek magjában nem az XML 1.0 szabvány, hanem az XML Inforset sabvány áll). Vagyis a XML technológia elméleti alapját a most bemutatott Infoset szabvány jelenti. XDM adatmodell Az Infoset modell 2004-ben készült el, s az azóta eltelt időben bekövekezett egy lényeges változás az XML alapmodellben. Az Infoset modellben a DTD szerepelt sémaintegritási eszközként. A DTD viszonylag szerényebb integritási lehetőségeit időközben felváltotta az XMLSchema gazdagabb eszköztára. Az XMLSchema lényeges változást jelent az alapmodellben, hiszen számos új modellelem megjelent, többek között a típusfigyelés, gazdagabb integritási szabályhalmaz. A megváltozott lehetőségek a alap absztrakciós modell továbbfejlesztését hozták magukkal. A legújabb eredmény ezen a területen a 2007-ben kiadott új W3C XML alapmodell, az XDM (Xquery and Xpath Data Model). Az XDM alapvetően az Infoset modellre épül, de kiegészíti azt az alábbi elemekkel: típuskezelés, az XMLSchema adattípusainak bevonása összetett szerkezeti struktúrák megjelenése szekvencia bevezetése 15
elemek rendezettségének figyelése a szekvencián belül Az XDM modellben az XML dokumentum egy szekveniának felel meg. A szekvencia tételek (item) rendezett litája, mindíg egyszintű, a lista egyetlen eleme sem lehet újra lista. A tétel fogalma magába foglalja a dokumentumháló egy tetszőleges csomópontját vagy atomi értékű levelét. Dokumentum alatt azt a hálót értjük,melynek gyökere a dokumentum elem. Ha a fa gyökere nem a dokumentum, akor a fát részfának (fragment) nevezzük. Mivel az XML dokumentumokat a lemezes tárolás során legtöbbször szöveges formátumban, helyesen formált XML dokumentumként tárolják, s ez a szöveges alak jelenik meg a közvetlen megtekintéskor (legyen az sima szövegszerkesztő vagy Internet böngésző), a felhasználókban óhatatlanul egy-egy pozíció is rendelődik az egyes elemekhez. Mivel a szöveges dokumentum egy linearizálása, sorosítása az XML dokumentumfának, ebben a sorosításban van értelme jobb és baloldali szomszédról, illetve elemek elhelyezkedési sorrendjéről beszélni. A forrás szöveges állomány alapján vett csomópont sorrendet nevezik dokumentum alapú sorrendnek. Szemléletes első megközelítésben azt mondhatjuk, hogy egy A elemet megelőz egy másik B elem, ha a B záró tagja előbb van a szöveges dokumentumban, mint az A nyitó tagja. Két elem pedig akkor szomszédos, ha záró és nyitó tagjaik között nem szerepel más elem nyitó vagy záró tagja. A szülő-gyerek viszony figyelembe vételével egy kicsit módosítani kell az előbbi egyszerűsített értelmezésen. A hivatalos dokumentum sorrendiség a fának egy fentről lefelé történő bejárásán alapszik. A sorrendiség értelmezésre vonatkozó legfontosabb szabályok: A dokumentum gyökere a legelső csomópont Minden csomópont előbb van, mint a gyermek és leszármazott csomópontjai A névtér csomópont előbb van mint az elemtulajdonság csomópont Az elemtulajdonság csomópontok előbb vannak mint az elemgyermekek A testvér elemgyermekek sorrendje balról jobbra való bejáráson alapul A leszármazottak előbb vannak, mint a testvérek Az XDM modellben a csomópontoknál hét különböző típust lehet megkülönböztetni a az Infosetben értelmezett tizenegytípus helyett. Az XDM az alábbi típusokat ismeri: dokumentum egység (az XML fa gyökere) jelölőelem egység (element) 16
elemjellemző (attribute) szöveg (text) névtér egység (namespace) feldolgozási utasítás (processing instruction) Az Inofset modellel összevetve hat típus közvetlenül átjött, egy típus módosulva került át, míg négy típus kimaradt. A módosulással átvett típus a karakteregység, melynél az XDM összevonja az egymásután következő karaktereket egy nagyobb, szövegegységbe. A kimaradt egységek alapvetően a DTD fogalomvilágához kötődnek, mint például a DTD-egység vagy a formátum jelölő. Ezek kimaradását a DTD elhagyása indokolja. Az XDM új eleme az adattípusok támogatása. A típusrendszer alapvetően az XMLSchema típusrendszerére épül, kiegészítve azt néhány további elemmel. A típusok egy hierarchiát alkotnak. A hierarchia tetején egy általános, minden típus szlőjeként kezel típus áll. A típusrendszer mind skalár mind összetett típusokat értelmez. A legfontosabb XDM adattípusok: anytype: minden típus őse anysimpletype: általános skalár és lista őstipus anyatomictype: általános skalár őstipus IDREFS, NMTOKENS, ENTITIES: lista típusok untyped: nem elemzett adat típusa user-defined compelx type: felhasználó által definiált összetett szerkezet integer: numerikus egész double: duplapontosságú numerikus long: hosszú numerikus egész short: rövid numerikus egész string: szöveg ID : azonosító IDREF: azonosító hivatkozás ENTITY: egyed 17
date: dátum time: időpont boolean: logikai A csomópontknál is viszonylag egyszerűbb a szerkezet, hiszen kevesebb tulajdonságot kell tárolni az egyes előfordlásoknál. A dokumetum csomópont szerkezete: csomópont típusa: dokumentum gyermek információs elemek listája (children), a lehetséges csomópont típusok listája: jelölőelem, feldolgozási utasítás, megjegyzés és szöveg. nem-elemzendő egyedek (unparsed entity): a beépített és a DTD-ben megadott ENTITY definíciókat tartalmazza, ha ez szerepel a dokumentumban dokumentum URI azonosítója (base URI) a befoglalt, leszármazott karakter elemekből összeállított szövegérték (string-value) a befoglalt elemekből összeállított értéklista (typed-value) A modell egyik alaptulajdonsága, hogy egyetlen csomópontnál sem lehet két szomszédos testvér mindegyike szöveg típusú, azaz szöveg típusú elemnek nem lehet szöveg típusú szomszéd testvére. A szövegcsompont a leghosszabb képezhető karakterláncot tartalmazza. A jelölőelem tulajdonságai: elem neve (node name) szülő elem (parent) típusának neve (az XMLschema alapján) elem URI azonosítója (base URI) gyermek csomópontok listája (children), a lehetséges típusok listája: elem, feldolgozási utasítás, megjegyzés és szöveg. itt definiált névterek listája (namespace attributes) 18
a befoglalt, leszármazott karakter elemekből összeállított szövegérték (string-value) a befoglalt elemekből összeállított értéklista (typed-value) ID szerepkörű-e az elem vagy sem (is ID) ID-REF szerepkörű-e az elem vagy sem (is IDREFS) Az elem neve tulajdonság értke magába foglalja mind a lokális nevet, a prefixet és a névtér értéket. Az elemjellemző csomópont tulajdonságai: elem jellemző neve (node name) szülő elem (parent) típusának neve (az XMLschema alapján) a befoglalt, leszármazott karakter elemekből összeállított szövegérték (string-value) a befoglalt elemekből összeállított értéklista (typed-value) ID szerepkörű-e az elem vagy sem (is ID) ID-REF szerepkörű-e az elem vagy sem (is IDREFS) Névtér csomópont tulajdonságai: előtag (prefix) szülő elem (parent) érték (URI) Feldolgozási utasítás csomópontja előtag (prefix) szülő elem (parent) érték (URI) Megjegyzés csomópont: 19
érték, szövege (content) szülő elem (parent) Szöveg-csomópont tulajdonságai: feldolgozó (target) utasítás (content) URI érték (base URI) szülő csomópont (parent) 20
References [1] N. Bradley: Az XML kézikönyv, SZAK Kiadó, 2000 21