XML

A dokumentumok fizikai szerkezete



Az entitások fajtái

Az XML dokumentumok egyszerűen karaktersorozatok. Nagy méretű XML dokumentumok készítése, áttekinthetősége, módosítása és karbantartása ugyanúgy nem könnyű, mint ahogy a nagy (sok sorból álló) programozási egységeké (függvények, eljárások) sem. Az XML rendelkezik egy a C nyelvű programokban használt #include (ez valójában Brian W. Kernighan M4 makro nyelvének direktívája) direktívához hasonló helyettesítő betöltő mechanizmussal, az entitással. Az entitás valójában egy szövegtöredék, amelyet egy névvel azonosítunk. Ez a szövegtöredék lehet egyetlen karakter, de lehet akár több millió karakter is. Az entitásokra nevükkel hivatkozhatunk, és minden ilyen entitáshivatkozást az XML processzor helyettesít a hivatkozott entitással. Az entitások lényegében arra valók, hogy segítségükkel egyszerűsítsük az XML dokumentumok fizikai struktúráját. Bár az esetek többségében egy entitás egy file-ban tárolódik, nem szabad egy-egyértelmű megfeleltetést tennünk az entitások és fizikailag tárolt formájuk között, már csak azért sem, mert az entitások nem feltétlenül tárolt fizikai egységek, hanem akár programmal is generálhatók.

A következő esetekben érdemes megfontolni egyedek használatát:

·        ugyanazt az információt több helyen is használjuk, és kétszeri beírása hibaforrás és időpocsékolás lenne

·        az információt az egymással nem kompatíbilis rendszerek másként jelenítik meg

·        az információ egy nagyobb dokumentum része, amit a jobb kezelhetőség érdekében részekre kell osztani

·        a szükséges információ XML-től eltérő adatformátumban áll rendelkezésre

Az entitások fajtái:

·        külső entitások (external entities)

·        belső entitások (internal entities)

·        elemzendő entitások (parsed entities – értsd – entites to be parsed)

·        nem elemzendő entitások (unparsed entities – értsd – entities to be unparsed)

·        általános entitások (general entities)

·        paraméter entitások (parameter entities)

Belső általános entitások (Internal parsed general entities):<

A legegyszerűbb entitás osztály. Ezek mindannyian olyan rövidítések, amelyek az XML dokumentum dokumentumtípus deklarációjában lettek megadva. Minthogy ezek deklarációjában az entitás egy literál, ezek mind elemzendő entitások (ezért hagytuk el a címben az elemzendő jelzőt.

 <?xml version=”1.0” ?>

<!DOCTYPE pelda SYSTEM ”pelda.dtd”

  [ <!ENTITY xml ”Extensible Markup Language”>]>

<pelda>

&xml;

</pelda>

A fenti példában az „xml” név az „Extensible Markup Language” karakterlánc neve. A karakterlánc egyben saját maga „azonosítója”, amelyet szokás belső azonosítónak is nevezni.

·         Egy belső általános entitás tehát egy belső azonosítóhoz rendel egy rövid nevet (rövidítés).

Amikor az XML dokumentumban hivatkozunk egy belső általános entitásra, akkor a processzor a hivatkozást a belső azonosító által azonosított karakterlánccal helyettesíti. A belső általános entitásokra csaknem bárhol hivatkozhatunk (elem tartalomként, attribútum értékként, attribútum alapértelmezésként, egy másik általános entitás tartalmában). Általános mivoltuk miatt azonban nem hordozhatnak olyan szerkezetleíró-deklarációkat (csakis elem vagy attribútum tartalmakat), amelyeknek a kifejtése a DTD-ben kell, hogy megtörténjék.

Külső elemzendő általános entitások (external parsed general entities):

A külső elemzendő entitások külső azonosítókhoz rendelnek rövid nevet (rövidítés). A külső elemzendő általános entitások használatára ugyanazok mondhatók el, mint belső társaikra. Van azonban egy lényeges „hiányossága” a külső elemzendő általános entitásoknak az XML specifikációnak köszönhetően. A specifikáció szerint egy dokumentum érvényesítése elemzéskor lehetséges, de nem kötelező. Ennek megfelelően egy processzor teljes mértékben ignorálhatja a külső elemzendő általános entitásokat és ezzel mellőzheti a dokumentum érvényesítését. Sajnálatos módon a processzornak ez a viselkedése nem befolyásolható semmiféle XML nyelvi konstrukcióval. Ennek az ajánlásnak a hátterében egyszerűen hatékonysági meggondolások voltak, a lényeg azonban az, hogy a külső elemzendő általános entitások nem portábilisak, ezért használatukkor erre mindig gondolni kell.

Nem elemzendő entitások (Unparsed entities):

A nem elemzendő entitások olyan adatobjektumok (dokumentum részek), amelyek nem XML szöveget tartalmaznak, pontosabban olyan adatcsonkok, amelyek tartalmát nem akarjuk elemezni. A NOTATION deklarációnál említést tettünk már a nem elemzendő entitásokról. Az ilyen entitásokra való hivatkozás annak elemzése nélkül helyettesítődik a hivatkozott entitással.

<!NOTATION JPEG SYSTEM “file:///jeryx/user/gifs/c.jpg”>

<!ENTITY image1 (SYSTEM “file:///jeryx/user/gifs/c.jpg” NDATA JPEG)>

A fenti példa egy külső nem elemzendő entitás deklarációja. A deklaráció az elemzendő külső entitások deklarációjától az ún. NDATA (No XML DATA) specifikációban tér el. Lényegében ez deklarálja, hogy a külső entitás nem elemzendő.

Belső és külső paraméter entitások (Internal and external parameter entities):

Az XML-ben deklarálható entitások osztályozhatók olyan szempontok szerint is, hogy az entitásra a DTD-ben vagy magában az XML dokumentumban kívánunk hivatkozni. Az előbbieket paraméter, az utóbbiakat általános entitásoknak nevezzük. A két entitás fogalom szükségességéhez az alábbi gondolatsor vezet el.

Az általános elemzendő entitások filozófiájához hozzátartozik, hogy ugyanaz az entitás név többször is deklarálható legyen, és többszörös deklaráció esetén az első deklaráció érvényes.

E mögött az áll, hogy egy külső entitás deklaráció eltakarható legyen egy belsővel. Ez csak akkor lehetséges, ha egy entitás deklarációban egy másik entitásra történő hivatkozás nem a deklarációban, hanem a deklarált entitásra történő hivatkozáskor lesz kifejtve (ebben az esetben és csak ebben az esetben lehetséges a deklarált entitásban hivatkozott entitás eltakarása annak újradeklarálásával). Ez alól a szabály alól az egyetlen kivétel, amikor egy általános entitásra egy attribútum deklaráció alapértelmezésében történik hivatkozás (a DTD más szövegkörnyezetében általános entitásra nem is hivatkozhatunk). Ez persze szükséges, mert a dokumentum elemzésekor a dokumentumok felépítésére vonatkozó szabályoknak ismerteknek kell lenniük. Ha csak általános entitásaink lennének, és ezekre minden korlátozás nélkül a DTD-ben is hivatkozhatnánk, akkor egy DTD készítője által a DTD külső tartományában deklarált entitás akár akaratlanul is eltakarható lenne a belső tartományban, amely adott esetben érvénytelen dokumentumhoz vezetne. Ugyanúgy, ahogy az általános entitások használatával egy XML dokumentum fizikailag több részre darabolható, miért ne tehetnénk meg ugyanezt a DTD-kkel. A DTD-k esetében is jó szolgálatot tesz, ha bizonyos elemtípus deklarációkra entitásként hivatkozhatunk, és ezeket több DTD-ben is fölhasználhatjuk anélkül, hogy azokat újra és újra minden egyes DTD-ben le kellene írnunk. Világos, hogy az általános entitásokkal, éppen a mögöttes filozófia diktálta kezelésük miatt, ez nem valósítható meg.

A paraméter entitások deklarálásának és referenciájának szintaxisa úgy különböznek az általánosétól, hogy az általános és paraméter entitásokkal való névütközés ne okozzon problémát. A paraméter entitások deklarációjában az entitás nevet, attól szóközzel elválasztva, megelőzi a % karakter, és az ilyen entitásokra történő hivatkozás %entitásnév; alakú. A paraméter entitások teljes elemtípus deklarációkat tartalmazhatnak, és rájuk „hatásosan” csak a DTD-ben hivatkozhatunk, ugyanis a % karakter az XML dokumentumban nem szerkezetleíró karakter. A paraméter entitások elemzendő entitások, és a rájuk történő hivatkozás (hatásosan) csak a DTD-ben lehetséges. A paraméter entitások ugyanúgy nem törhetnek több darabba szerkezetleírókat, mint ahogy az általános entitások sem, azonban képezhetik szerkezetleírók egyes részeit, ha külső entitások; a belső paraméter entitások esetében az XML előírja, hogy csak teljes szerkezetleíró deklarációkat tartalmazhatnak. Másik eltérés az általános entitásoktól a rájuk való hivatkozás kezelésében van. Egy paraméterentitásra történő hivatkozás azonnal kifejtődik, ami azt is jelenti, hogy egy paraméter entitásra való hivatkozást mindig meg kell, hogy előzzön az entitás deklarációja, míg ez nem minden esetben követelmény az általános entitások esetében. Ennek oka az, hogy egy paraméter entitás hivatkozás csak a DTD-kben fordulhat elő (pontosabban a szintaxisa következtében az XML dokumentumokban előforduló paraméter entitás hivatkozások nem minősülnek entitás hivatkozásnak). Az alábbi két példa általános és paraméter entitás deklarációkat és hivatkozásokat mutat.

1.Példa:

<!-- Példa általános entitás deklarálására és hivatkozására, ahol a hivatkozás megelőzi a deklarációt -->

<!ENTITY e1 “This is an entity referring to the entity2: &e2;”>

<!ENTITY e2 “This is entity2”>

<!ELEMENT root desc CDATA “&e1;”>

2.Példa belső paraméter entitás deklarációjára és hivatkozására

<!DOCTYPE pelda[<!-- paraméter entitás deklarációja -->

<!ENTITY % pelda-entitas “

<!ELEMENT pelda (#PCDATA)>”>

%pelda-entitas; ]>

Az entitás értékként megadott literál nem tartalmazhat % és & jeleket, amennyiben ezek nem entitáshivatkozásokat vezetnek be. Az & jel esetében használhatjuk az &amp; karakterentitás hivatkozást, a % esetében magunk definiálhatunk rá karakterentitást Unicode-jának használatával.