XML alapismeretek

Ebben a fejezetben néhány hasznos információt gyűjtöttem össze az XML-lel kapcsolatosan. Ezek ismerete nem elengedhetetlen az SVG megismeréséhez, de a fejezet elolvasását javaslom mindenkinek, aki sosem hallott még az XML-ről.


Egy kis történet

Az XML kidolgozását 1996-ban kezdték el, és 1998-ban lett a W3C ajánlása. A betűszó az Extensible Markup Language elnevezésből származik, ami magyarul Kiterjeszthető jelölőnyelvet jelent. Az XML egyik célja webes tartalmak minél egyöntetűbb, azonos szabályoknak megfelelő leírása. Erre azért van szükség, hogy a keresők könnyebben és hatékonyabban értelmezhessék és indexelhessék a webes tartalmakat.

Egy XML dokumentum valójában általában egy szöveges fájl, ami az ember és a gépek számára is jól olvasható. A tartalmára semmilyen szabály nem vonatkozik, a szerkezetére azonban igen. Innen ered az elnevezés is: a megadott formában bármilyen tartalom leírható, de a nyelv szabályait be kell tartani. Vagyis a cél, hogy a leírás a tartalomtól függetlenül feleljen meg egy nyelvtannak, így a fájlok bármiről tartalmazhatnak leírást. Ennek megvalósítására már korábban is történt kísérlet, ez volt az SGML. A szó Structured Generalized Markup Language rövidítése, ami magyarra fordítva Strukturált Általános Jelölőnyelvet jelent. Ez azonban túlságosan általános és bonyolult volt, így valódi célját nem érte el. Emiatt a W3C kialakított egy ajánlást, ami az SGML-en alapul, azonban annak webes felületekhez alkalmazható, leegyszerűsített változata.


Az XML szabvány célkitűzései

Ezeket a szabályokat a W3C az XML specifikációjának elkészítésekor fektette le. A célok többé-kevésbé megvalósulni látszanak.

  1. Az XML legyen könynen használható az Interneten.
  2. Az XML támaogassa az alkalmazások minél szélesebb körét.
  3. Legyen SGML-kompatibilis.
  4. A dokumentumok feldolgozására egyszerűen lehessen programokat írni.
  5. Kerülni kell az opcionális lehetőségeket.
  6. Az XML dokumentum forrása legyen világos és olvasható.
  7. A szabványt rövid idő alatt ki kell dolgozni.
  8. Az XML szabvány legyen formális és tömör.
  9. Az XML dokumentumok legyenek egyserűen elkészíthetők, szerkeszthetők.
  10. Egy XML dokumentumnál a tömörség másodlagos szerepű.

A dokumentum felépítése

Egy XML dokumentumot nagyon könnyen létre lehet hozni. Bármilyen egyszerű szövegszerkesztő alkalmas a célra. Egyetlen kritérium, hogy lehetőség legyen csak a szöveg mentésére, a formázókarakterek és egyéb információk nélkül. Ha semmilyen speciális formátumot nem használunk, akkor a fájl kiterjesztése xml legyen. Ha valamilyen XML alapú szabványt választunk, akkor a kiterjesztés a szabványban megadott lesz. Például SVG használata esetén a kiterjesztés svg lesz, az XHTML nyelvű weboldalak kiterjesztése pedig html.

A legfontosabb szabály, amiről nem feledkezhetünk meg, hogy az XML dokumentumokban a kis- és a nagybetűk különböznek, vagyis például a BETŰ és a betű karaktersorozat eltérő jelentéssel bír.

A dokumentumban elhelyezhetünk megjegyzéseket is. Ezt a <!-- és a --> jelek közt kell elhelyezni. A megjegyzések bármit tartalmazhatnak, kivéve a -- karaktersorozatot. Ha ékezetes betűket használunk, akkor szükség van még arra is, hogy olyan karakterkódolással mentsük a munkát, ami lehetővé teszi használatukat. Pl. UTF-8. A megjegyzések bárhol elhelyezhetőek, kivéve a nyitó- ill. a lezáró kódelemeken belül. Ezekről hamarosan szó lesz.

A dokumentum egy fejrészből és a dokumentumtörzsből épül fel.

A fejrész felépítése

A fejrész tartalmaz egy XML-deklarációt, amiben megadható az éppen használt XML verzió - ami jelenleg az 1.0 - és a karakterkódoláshoz használt szabvány is. Egy fejléc például így néz ki:

<?xml version="1.0" encoding="ISO-8859-2"?>

Ez a sor azt jelenti, hogy az 1.0 verziót használjuk és a szüveget az ISO-8859-2 szabvány szerint kódoltuk. Ez lehetővé teszi a magyar ékezetes betűk használatát is. SVG dokumentumok esetén - ha ékezetes betűket is írunk - az UTF-8 szabványt kell használni és figyleni kell arra, hogy a mentést is ennek megfelelően végezzük. A fejléc tartalmazhat még különböző feldolgozási utasításokat ill. stíluslapok csatolását is.

A dokumentumtörzs felépítése

A dokumentum törzse a tulajdonképpeni tartalom leírása. Mielőtt ennek szerkezetére rátérnénk, néhány fogalom megismerésére van szükség:

Először következzen egy kis magyarázat a fogalmakhoz. A könnyebb megértéshez az alábbi egyszerű XML dokumentumon fogom bemutatni az egyes fogalmak jelentését. A fejrész most az előzőek szerint a verziót és a kódolást tartalmazza. Ezen kívül a fájlban megtaláljuk két könyv adatait a házi könyvtárból.


<?xml version="1.0" encoding="ISO-8859-2"?>

<hazikonyvtar>

	<konyv id="111">
		<szerzo>J. David Eisenberg</szerzo>
		<cim>SVG kézikönyv</cim>
		<kiado>Kossuth Kiadó</kiado>
	</konyv>

	<konyv id="702"/>

	<konyv id="112">
		<szerzo>Winkler Róbert</szerzo>
		<cim>Nagyvárosi természetbúvár</cim>
		<kiado>Tericum</kiado>
	</konyv>


</hazikonyvtar>

Elemek és attribútumok

A HTML nyelv ismerői tudják, hogy egy weblap elkészítésekor különböző cimkék használatára van szükség. Egy cimke rendelkezik egy névvel és lehetnek bizonyos tulajdonságok, amiket megadhatunk hozzá. Az XML-ben egy kicsit szigorúbb szabályokat követve, de tulajdonképpen ugyanilyen cimkékkel lehet dolozni. Egy elem nyitó- és záró kódelemből áll. Az elem nevét és attribútumait < és > jelek közt kell elhelyezni. A záróelem abban különbözik a nyitótól, hogy a név előtt egy / jel szerepel.

A nyitó kódelemen belül helyezkedhetnek el az attribútumok. Az attribútumok értékeit idézőjelek közt kell megadni. A nyitó- és a lezáró kódelem között helyezkedhet el az elem tartalma.

Az elemek és attribútumok nevének megadására az alábbi szabályok vonatkoznak:

A példában szereplő elemek: hazikonyvtar, konyv, szerzo, cim és kiado. Egyetlen attribútum jelenik meg, az id nevű.

Elem tartama és üres elemek

Az elemek tartalma többféle lehet:

A legegyszerűbb a szöveges tartalom. Bármilyen karakteres adat elhelyezhető egy elemen belül. Ezen kívül tartalmazhat elemeket is, ill. azoknak is lehet bármilyen tartalma. Ily módon egy faszerkezet építhető fel az egyes elemek egymásba ágyazásával. A kétféle tartalom keverten is megjelenhet, azaz lehet egy elemnek szöveges tartalma és mellette tartalmazhat beágyazott elemet is.

Azokat az elemeket, amik nem tartalmaznak sem szöveget, sem beágyazott elemet üres elemnek nevezzük. Ezeknél az elemeknél nem kell külön nyitó- és záró kódelemet kiírni. Elegendő, ha a nyitó kódelem végén egy / jel szerepel a kódelem végét jelző > előtt.

A példában üres elem a 702-es azonosítóval ellátott konyv elem. A könyv elem a másik két esetben tartalmaz más elemeket. A szerzo, cim és kiado elemek tartalma szöveges. Vegyes tartalom nem szerepel a dokumentumban.

Szülő- és gyermek elemek, gyökérelem

Az előző részben láttuk, hogy egy elem tartalma egy másik elem is lehet és így egy faszerkezet hozható létre belőlük. Ebben a szerkezetben a külső elemet szokás szülőnek, a beágyazottat pedig gyermeknek nevezni. A további "rokonság" a köznapi szóhasználattal összhangban áll. Egy elem összes beágyazott eleme a leszármazottja és egy elemnek az összes őt tartalmazó elem az őse.

A példában a konyv elem szülője a cim nevűnek. A cim szülője a konyv, és őse a hazikonyvtar. További rokonsági kapcsolatok is megtalálhatók.

A dokumentumfa tetején álló elem a gyökérelem.

A példadokumentum gyökéreleme a hazikonyvtar. A dokumentumnak akkor van vége, ha ezt is lezártuk.

Szabályok

A dokumentum törzse egymásba ágyazott elemekből áll. Egy dokumentum tetszőleges számú- és típusú elemből állhat, de héhány alapvető szabályt be kell tartani:

Jólformázott és érvényes dokumentumok

Az eddig megismert szabályok betartásával jólformázott XML dokumentumokat hozhatunk létre.

Egy dokumentum érvényes, ha jólformázott és a tartalma megfelel a dokumentumtípus-definícióban (DTD-ben) megadott szabályoknak. Dokumentumtípus-definíciót bárki készíthet saját maga is. Ennek tartalma tulajdonképpen azoknak az elemeknek, attribútumoknak a felsorolása, amelyek szerepelhetnek a dokumentumban. Az egyes attríbútumokhoz meg lehet adni azt is, hogy milyen típusú értéket vehetnek fel, ill. felsorolhatók konrét lehetőségek is. Különböző egyéb szabályok is felállíthatók az attribútumok kapcsolataira. Pl. legyen az x elemnek minimum 3 gyermekeleme, stb.

Hogy egy dokumentumról tudjuk, hogy melyik DTD-nek kell megfelelnie a fejrészben meg kell adni ennek helyét. A bejegyzést a feldolgozási utasítások után kell elhelyezni. Ezt a DOCTYPE kulcsszóval tehetjük meg:

<!DOCTYPE nevter dtdhely>

A DTD elhelyezkedhet az XML dokumentumban, ill. külső fájlban is. Ha a DTD a fájlban helyezkedik el, akkor nem kell megadni a helyét, hanem az elérési út helyett a tartalom következik. A DTD-k formai követelményeiről itt nem lesz szó. Ha valamilyen webhelyen tároljuk a DTD-t, akkor tetszőleges hivatkozás mutathat egy webhelyre, vagy nyilvános bejegyzésre, ahol a DTD elérhető. Egyes szabványos XML dokumentumokhoz nyilvános bejegyzések tartoznak. Ekkor a DTD-re való hivatkozást a PUBLIC szó előzi meg és a hiatkozás sem egy valódi link, hanem a bejegyzés helyére utal. Ezt tapasztalhatjuk például egy HTML vagy egy SVG dokumentumban is.


Névterek

Abból, hogy tetszőleges nevű elemeket használhatunk egy dokumentum elkészítésekor több probléma is adódhat. Leggyakrabban azzal kerülünk szembe, hogy többféle dokumentumban szerepel ugyanaz a név egy elem neveként. Ha a dokumentumok egyesítésére van szükség, akkor lehet segítség a névterek használata. Az esetleges összekeveredésen kívül a megjelenítés is okozhat problémát. Előfordulhat, hogy a végeredmény teljesen másképp néz majd ki a keveredés miatt, nem beszélve arról, hogy fontos információk veszhetnek el.

Ennek kiküszöbölése érdekében az egyik típusú dokumentum elemeiben az összefésüléskor meg kell jelölni, hogy melyik névtérhez tartozik. Ezt úgy lehet megtenni, hogy a nyitó- ill. záró kódelelemekben a < után a névtér nevét írjuk, majd egy kettőspontot követően az elem nevét. Ezzel elkerülhetők az ütközések.

Hogy egy adott elemről tudjuk, hogy melyik névtérhez tartozik, ezt meg kell adni a gyökérelemében. Erre szolgál az xmlns attribútum. Ebben a névteret kell megadni, amit használni kívánunk alapértelmezett névtérként. Ekkor ha másként nem rendelkezünk, a dokumentumban minden elemet úgy fogunk kezelni, hogy az így megadott névtérből valók. Az alapértelmezett névtér elemeit nem kell megkülönböztetni, nem kell a kódelemekben megjelölni a névtérhez tartozást.

Mivel általában több névteret szeretnénk használni, lehetőség van több névtér megadására is. Ilyenkor az xmlns attribútumot egy kettőspont után a névtér neve követi. Az attribútum értéke most is a névtér megjelölése szükséges. Ezután ebből a névtérből minden elemre a névtér nevével és az attribútummal hivatkozhatunk.

Visszatérve a példánkhoz, egészítsük ki a nyilvántartást CD-k adataival is, cd nevű elemekben. Tároljuk az együttes nevét és az album címét. Ekkor a cim attribútum már két helyen szerepelhet. Ezért vezessünk be egy új névteret, amiben a CD-k leírására használható attribútumok és elemek kerülnek definiálásra. Az alapértelmezett névtér legyen a könyveket leríó elemekhez tartozó. A módosítások az alábbi pédán láthatók.


<?xml version="1.0" encoding="UTF-8"?>

<hazikonyvtar xmlns="http://www.seholsem.hu/konyv"
              xmlns:cd="http://www.seholsem.hu/cd">

	<konyv id="111">
		<szerzo>J. David Eisenberg</szerzo>
		<cim>SVG kézikönyv</cim>
		<kiado>Kossuth Kiadó</kiado>
	</konyv>

	<konyv id="702"/>

	<konyv id="112">
		<szerzo>Winkler Róbert</szerzo>
		<cim>Nagyvárosi természetbúvár</cim>
		<kiado>Tericum</kiado>
	</konyv>

	<cd:cd>
		<cd:egyuttes>kispál és a borz</cd:egyuttes>
		<cd:cim>én, szeretlek, téged</cd:cim>
	</cd:cd>

</hazikonyvtar>

Jól látszik, hogy a cd leírásakor az elemek előtt a névtér is meg van jelölve, így jól elkülöníthető a kétféle adattípus.