Windows - XML adattípusok

XML 9. rész

Cikksorozatunkban már láttunk példát, hogy lehet XML állományokban adatokat tárolni. Akkor még nem foglalkoztunk a lehetséges típusokkal (karakterlánc, szám, bináris, stb.) az adattárolást azonban máshogy nem lehet megoldani, mindenképpen szükség van valamilyen meghatározásra. Az alábbiakban megnézzük, hogy az XML rugalmassága hogy fér össze az alkalmazások szigorú típus meghatározásával.
XML-ben nincs szükség olyan hagyományos értelemben vett adattípusokra, mint például a Pascal integer vagy real típusú változói. Nincsenek megkötések a dátumformátumra (bár készíthetünk szűrőket). Hogy miért? Mert az XML csak azt mondja meg, hogy az adat milyen jelölőelemek közé van zárva, továbbiak a feldolgozó alkalmazásra hárulnak.
Az XML fájlok szöveges formátumúak, ami némileg behatárolja a bináris adatok tárolását. Ennek ellenére nem lehetetlen akár képeket, ikonokat, stb. elhelyezni a forráskódban. Példának vehetjük a Windows XP MMC felügyeleti konzoljait. Keresünk meg a %systemroot%\system32 mappában valamelyik MSC kiterjesztésű állományt és nyissuk meg egy szövegszerkesztővel. Látható, hogy a kód nagyobbik felét ikonok alkotják, melyek ASCII karakterekkel vannak leírva:
</Binary>
<Binary Name="CONSOLE_FILE_ICON_SMALL">
SUwBAQEAAgABABAAEAD/////EQD//////////0JNNgAAAAAAAAA2AAAAKAAAAEAAAAAQAAAAAQAQ
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQQhhjGGMYYxhjGGMYYxBC
....
Legtöbb esetben tökéletesen tárolhatók így az adatok, főleg, ha figyelembe vesszük, hogy lehet akár tömöríteni is, értelmezni úgyis a feldolgozó program fogja.
Programozók saját alkalmazásaikhoz kénytelenek konvertáló és értelmező modulokat készíteni, főleg, ha egyedi adatokkal dolgoznak (pl.: x értéke minimum 1 és maximum 5 lehet). Ekkor jöhet jól egy külső program, amelyik képes figyelni az XML fájlba kerülő adatokat és a meglévőket ellenőrzi, megfelelnek-e a feltételeknek.
Az alapvető tárolási mód tehát a sztring. Bizonyos esetekben szükség lehet ezen változtatni és előírni, hogy az adott érték számot takar. Ilyen helyzet, ha sorba rendezzük egy lista elemeit. Vegyük például a következő felsorolás:
<lista>
 <elem>Toth Jozsef</elem>
 <elem>Zalka Mate</elem>
 <elem>Nyomasek Bobo</elem>
 <elem>Alkalmi Jeno</elem>
</lista>
Sorbarendezésnél (sort parancs) ezek ábécé sorrendben jelennek meg:
<template match="lista">
 <apply-templates><sort/></apply-templates>
</template>
A kimeneti dokumentumban az "Alkalmi Jeno" elem jelenik meg elsőként.
Ha viszont felbontjuk a neveket vezeték és keresztnévre, akkor megadhatjuk, hogy elsőként a vezetéknevek szerint történjen a rendezés, ha van köztük egyező, akkor a keresztnevek döntsenek:
<template match="lista">
 <apply-templates>
  <sort select="vezeteknev"/>
  <sort select="keresztnev"/>
 </apply-templates>
</template>
Eddig minden elem sztringként tárolódott, ha viszont a rendezést számok szerint akarjuk végeztetni, akkor a "number" elemet kell közbeszúrni:
<template match="lista">
 <number/><apply-templates>
</template>
Ezzel utasítjuk a feldolgozót, hogy számokként értelmezze az adatokat. Nyilván a fenti nevek nem felelnek meg a kritériumnak.
DataType
Nézzük meg a következő kódot:
<?xml version="1.0"?>
<weather xmlns="x-schema:weatherSchema.xml">
  <date>2002-08-01</date>
  <degrees>28.5</degrees>
</weather>
Eltároltunk egy évszámot és egy nem egész számot. Utóbbi az adott dátumhoz tartozó átlaghőmérséklet. A "weatherSchema.xml" tartalma az alábbi:
<Schema xmlns="urn:schemas-microsoft-com:xml-data" xmlns:dt="urn:schemas-microsoft-com:datatypes">
  <ElementType name="date" content="textOnly" dt:type="date"/>
  <ElementType name="degrees" content="textOnly" dt:type="float"/>
  <ElementType name="weather" content="eltOnly">
    <element type="date"/>
    <element type="degrees"/>
  </ElementType>
</Schema>
A dt kifejezés az "urn:schemas-microsoft-com:datatypes" névtér által meghatározott adattípusokra vonatkozik. Eszerint beszélünk "date", "float" és "eltOnly" típusokról. Alapértelmezésben ezek nincsenek benne az XML nyelvben, de a megadott névtérben igen és a fenti módon használhatók. Szintén a névtér specifikációja határozza meg, hogy mit is jelent pontosan a "date", milyen dátumformátumot fogad el, stb.
A következő két példákban az adattípusok deklarálása eltérő módon történik. Elsőként jelölőelemek példányai foglalják magukba az adatelemeket (ilyet láttunk fent):
<shoes xmlns:dt="urn:schemas-microsoft-com:datatypes" id="f1121" sizes="mens"/>
<sizes id="mens">
  <size dt:dt="int">8</size>
  <size dt:dt="int">10</size>
  <size dt:dt="int">12</size>
</sizes>
Majd úgy deklaráljuk a típusokat, mint a jelölőelemeket:
<shoes xmlns:dt="urn:schemas-microsoft-com:datatypes" id="f1121" sizes="array1"/>
<array id="array1">
  <dt:int>8</dt:int>
  <dt:int>10</dt:int>
  <dt:int>12</dt:int>
</array>
Fenti példáinkból kiviláglik, hogy az XML nem definiál saját adattípusokat, de a forráskód megfelelő alakításával és a feldolgozó programok vagy XML névterek használatával tetszőleges típusok állíthatók elő.

XML cikksorozat