XML sémák, adatmodellezés
Saját jelölőnyelv
Az XML nem egy nyelv, hanem egy eszköz, szabályok összessége
Amikor létrehozunk egy saját jelölőnyelvet, meghatározzuk, hogy a problémával és adattípussal kapcsolatban milyen címkéket és attribútumokat használhatunk.
Ezek egymás közti viszonyát is le kell írni
Például sporteredmények létrehozására: SportsML www.sportsml.org
Előbbieket egy formális leírással tehetjük meg, ami megadja a dokumentumok felépítését.
Ezt a formális nyelvet (szabályhalmazt) nevezzük egy jelölőnyelv sémájának.
Adatmodellezés
Az a folyamat, amikor létrehozunk egy sémát egy XML dokumentumtípushoz, az adatmodellezés.
A sémák lehetővé teszik a az XML dokumenttumok szerkezeti és logikai ellenőrzését.
A sémák lényegében hasonlíthatók egy hivatalos pecséthez.
Ennek jelentősége a feldolgozó alkalmazásoknál van.
Két technológia áll rendelkezésre séma létrehozására:
DTD (Document Type Definition) XSD (XML Schema Definition)
Az XML dokumentumok jól formáltsága
A dokumentum érvényessége (validity) mellett másik fontos fogalom a jól formáltság. Egy dokumentum jól formázott, ha szerkezetileg megfelel az XML szabvány minden egyes előírásának (az 5 feltétel). Elképzelhető, hogy egy dokumentum jól formázott, de nem érvényes Æ nem felel meg valamilyen szabályrendszernek. A helyességnek tehát 2 foka van: 1. 2.
Jól formáltság Érvényesség (valamilyen DTD vagy XSD alapján)
Minden érvényes dokumentum jól formázott, de nem minden jól formázott dokumentum érvényes.
A DTD
Eredetileg az SGML (a HTML elődje) fejlesztői dolgozták ki A DTD tehát egy régi technológia, mégis a mai napig rengetegen használják A DTD egy XML-től különböző felépítésű jelölőnyelv Előnye:
Rendkívül egyszerű Tömör
Az XSD
A DTD-t hivatott leváltani
A séma létrehozásához magát az XML-t használjuk
Itt már megadhatók típusok is (DTD-ben csak szöveg lehet)
A W3C dolgozta ki
Példa: a kvíz feladat xsd-je
Előnye:
Az XSD sokkal részletesebb mint a DTD XML használata az xsd-hez Hatékonyabb mint a DTD
Hátrány:
Nehéz őket átlátni (elsőre)
Sématechnológiák összehasonlítása
A DTD-ket egy speciális nyelven kell megfogalmazni, míg XSD-nél az XML-t használjuk
Az XSD számos adattípus használatát lehetővé teszi (egész, lebegőpontos számok, logikai értékek,stb), míg DTD-ben csak karakterlánc van
Az XSD-ket ugyanúgy kezelhetjük, mint bármely más XML dokumentumt
A DTD használata széleskörűen elterjedt
Számos létező jelölőnyelv sémája DTD-ben elérhető csak
A DTD séma
A DTD tehát a dokumentumok logikai szerkezetét írja le
Egy DTD-ben a következő dolgokat adhatjuk meg:
A dokumentumtípusban megengedett elemek körét Az egyes elemekhez rendelhető attribútumokat
Amikor összerendelünk egy XML és egy DTD dokumentumot, két lehetőségünk van:
Belső DTD Külső DTD
A belső DTD nagyobb prioritású mint a külső (lásd. CSS)
Beszélünk DTD deklarációról és definícióról
Deklaráció: az XML dokumentumnak megadjuk ,hogy hol a DTD Definíció: a DTD tényleges tartalmi része
A DTD részei A deklaráció általános alakja:
A KülsőDTD a DTD fájl URI-ja URI: Uniform Resource Identifier, az URL (…Locator) olyan általánosított változata, amellyel fájloktól kezdve különböző hálózati erőforrásokat azonosíthatunk. A deklarációnak az XML deklaráció után, de a gyökérelem előtt kell szerepelnie
Külső erőforrás használata: Ha nincs DTD-nk (és egyéb információforrásunk), akkor ”yes”-t adunk meg
Elem vagy attribútum használata? Attribútum
Előny
Meghatározhatjuk a lehetséges értékeit egy felsorolás formájában Lehet alapértelmezett értékük Van adattípusa (igaz szűk listából választhatunk) Tömör információtárolás
Hátrány:
Nem alkalmas hosszú karakterláncok tárolására Nincs lehetőség az információk egymásba ágyazására
A DTD elemei: üres elem Elemek megadásának alakja: Az XML négy elemtípust különböztet meg: 1. 2. 3. 4.
1.
Empty: üres elem Element-only: csak gyermekelemet tartalmaz Mixed: kevert, szöveget és gyermekelemet is tartalmaz Any: tetszőleges typus, bármit tartalmazhat, amit a DTD megenged
Üres elem:
Sem szöveget sem gyermekelemet nem tartalmazhat, viszont lehetnek attribútumai Deklarációja: Példa: HTML-ben
A DTD elemei: csak elemeket tartalmazó elem 2. Element-only (csak elemeket tartalmaz):
A tartalomtípus meghatározza, hogy milyen más elemeket tartalmaz az adott elem, ezt kerek zárójelek között kell megadni.
Lehet sorozatokat, vagy választási csoportokat írni, a sorozatoknál az lemek sorrendje kötött A sorozatban az elemeket vessző, a csoportokban | választja el
Az alkalmazható szimbólumok:
( gyermekelemek ): sorozatot vagy választási csoportot fog „közre” , (vessző): sorozat elemeit választja el | (szűrőkarakter): választási csoportok elemeit választja el Nincs szimbólum: jelzi, hogy az elem pontosan egyszer fordulhat elő ? (kérdőjel): az elem pontosan egyszer, vagy egyszer sem fordulhat elő + (pluszjel): az elemnek legalább egyszer elő kell fordulnia * (csillag): az elem tetszőleges sokszor előfordulhat
Példák csak elemet tartalmazó elem DTD-jére 1.
2.
3.
A resume csak elemeket tartalmazó elem Az intro pontosan egyszer fordul elő a resume-ben Az education és experience csoportnak legalább egyszer szerepelnie kell Az education pontosan egyszer fordul elő Az experience legalább egyszer előfordul A hobbies legfeljebb egyszer fordulhat elő A references akárhányszor előfordulhat Az item három elemet tartalmazhat A title mindig előfordul egyszer A link és a description vagy egyszer vagy egyszer sem fordul elő
Az item a három elem közül az egyiket tartalmazza csak
A DTD elemei: kevert és tetszőleges tartalmú elemek 1.
Csak szöveget tartalmaz:
2.
A kevert elem:
3.
Parsed Character Data Pl.:
A *(csillag) a végén kötelező! Ennek gyakorlati haszna nem igazán van, kerüljük a használatát
A tetszőleges tartalmú elem (any)
Nem rendelkeznek belső szerkezettel Bármit tartalmazhat Ennek a használata is kerülendő
Példa
Hozzunk létre egy olyan adatstruktúrát, amivel recepteket tudunk tárolni.
Recept neve, összetevők, elkészítés
Majd hozzunk létre a struktúrához egy DTD sémát
Hozzunk létre egy adatstruktúrát mozifilmek adatainak tárolásához Majd hozzunk létre a struktúrához egy DTD sémát
Attribútumok DTD-ben
Az attribútumot tehát kiegészítő információk tárolására használjuk Az attribútum név/érték páros
Megadása:
Az alapértelmezett értéknek (default) 4 típusa létezik:
#REQUIRED – kötelező az attr. Megadása #IMPLIED – opcionális a megadása #FIXED – az attr. kötött értékkel rendlkezik, az értéket a deklarációban a #FIXED után kell megadni ” ” között Default – az alapértelmezett érték, ha nem adunk meg értéket neki
Attribútumtípusok DTD-ben Az attribútumoknak 10 típust adhatunk meg: CDATA – szöveges adat Enumerated – karakterek sorozata NOTATION – egy a DTD más pontján megadott jelölés ENTITY – külső bináris egyed ENTITIES – több külső bináris egyed üres karakterekkel elválasztva ID – egyedi azonosító IDREF – egy a DTD más pontján deklarált ID-re mutató hivatkozás IDREFS – több különböző, máshol deklarált ID-re mutató hivatkozás NMTOKEN – XML tokenekből (számok, betűk, pontok, kötőjelek, kettőspontok, aláhúzásjelek) felépített név NMTOKENS – több XML tokenből felépített név
Attribútumtípusok osztáyozása: Az előző típusokat feloszthatjuk 3 részre: 1.
Karakterláncok: a leggyakrabban használt típus
2.
CDATA Pl.: Az education elemnek van egy school attribútuma, melynek megadása kötelező
Felsorolt típus: a felsorolt típushoz tartozó attribútumok értékei egy halmazból kerülnek ki.
A deklarációban a lehetséges étékeket kell megadni
Attribútumtípusok osztályozása 3.
Tokenizált attribútumok:
A tokenizált attribútum értékét az alkalmazás tokenekre bontja. A tokenek határai az üres karakterek (szóköz, tabulátor, új sor).
ID: mindig betűvel kezdődik és számmal, ponttal, aláhúzással vagy kötőjellel folytatódik
IDREF, IDREFS: kereszthivatkozások megadása
Pl: Pl.:
NMTOKEN, NMTOKENS: speciális karaktersorozat, csak nevekben megengedett karakterek, nem lehet szóköz és szám ENTITY, ENTITIES (lásd.:egyedek):
Pl.:
Példa egy teljes DTD-re: edzésterv Készítsünk egy számítógépes edzéstervet. Amit tárolni kell: Dátum (date) – edzés ideje Edzéstípus (type) – edzés típusa (úszás, futás vagy kerékpár) Pulzusszám (heartrate) – átlagos pulzusszám az edzés során Időtartam (duration) – az edzés hossza (mp, perc, vagy óra) Távolság (distance) – a távolság km-ben vagy mérföldben Hely (location) – az edzés helye Megjegyzések (comments) – egyéb információ
Több megoldás létezik, egy lehetséges megoldás:
Attribútum: dátum, edzéstípus, pulzusszám (gondolkodjunk, hogy melyiket kötelező megadni és melyiket nem) Elem: időtartam, távolság, hely, megjegyzések
Az XML egyik szabálya: minél több korlátozást alkalmazunk egy dokumentum tartalmával kapcsolatban, annál jobb lesz a szerkezete.
Mik azok az egyedek?
Egyedeknek számítanak az XML dokumentumon kívüli hivatkozások (pl. fájlra, vagy weboldalra, stb.) Pl.: a HTML-ben egy kép egyedként van jelen
Az XML dokumentum elején a külső DTD-ra való hivatkozás (vagyis a DTD fájl) egyednek számít.
Megkülönböztetünk:
Értelmezett egyed: amit a dokumentum feldolgozása során értelmezni fognak (csak szöveges adat lehet) Nem értelmezett egyed: szöveget és bináris adatokat egyaránt tartalmazhat
Az értelmezett egyeden belül megkülönböztetünk:
Általános egyedek Paraméteregyedek
Mik azok az egyedek?
Általános egyedek:
Amit a dokumentumban lévő használatra terveztek. Pl.: egy cégnév vagy egy cím, amit többször fel akarunk használni Megadása: Kötelező belső DTD-ben ezt megadni!!!! Pl.: Ilyen egyedek a <>, stb.
Paraméteregyedek:
Kizárólag a DTD-ben használunk, célja: helyettesítés Előfordulhat, hogy több elemnél ugyanolyan attribútumlistát használunk, ilyenkor ezt berakhatjuk egy paraméteregyedbe Alakja: Pl.: Hivatkozás: %Egyednév; Pl.: Pl.:
Feladat: Készítsünk XML rádiót
Egy FLASH lejátszó XML dokumentumot képes kezelni. Cím: www.catalistcreative.com Adott a DTD fájl, készítsük el ez alapján az XML dokumentumot DTD:
A névterek használata
A névtér olyan elem és attribútumnevek halmaza, melyeket egy adott XML dokumentumban használhatunk. Rendeltetése: a nevek közti ütközések feloldása Pl.: zene és videógyűjtemények leírása egy fájlon belül, és pl. mindkét címe
Új fogalom: érvényességi kör Pl.: edzés XML
Egy elem v. attr. érv. köre a hierarchiában elfoglalt helye.
Egy adott csomóponton bevezetett névtér az alatta lévő elemekre fejti ki hatását.
Vannak globális névterek, amelyek a dokumentum egészére hatnak.
A névterek használata
Névterek elnevezése:
Névterekhez kizárólag URI (egységes erőforrás azonosító) címeket rendelhetünk. Pl.: <media xmlns:mov=”http://www.ektf.hu/~szlahorek/ns/media” > A létezés nem követelmény, az egyediség számít!
Névterek deklarálása:
Amennyiben egy névteret a dokumentum egészére szeretnénk alkalmazni, azt a gyökérelemben kell megadni. A névtér megadása: xmlns:névtérnév=”az uri azonosító” A névtérnév megadása nem kötelező, csak akkor, ha minősített neveket akarunk használni az elemek és attribútumok elnevezésénél. Pl.: <mov:title>Volt egyszer egy vadnyugat Két lehetőség:
Alapértelmezett névtér deklaráció: nem kell névtérnevet adni Explicit névtér deklaráció: névtérnevet kell megadni, és mindazon elemnél és attribútumnál használni kell a névtérnevet, amit a névtérhez akarunk sorolni. Pl.: <mov:title>
A névterek használata
Megoldás a zene és videogyűjtemények leírására:
<mediacollection xmlns:mov="http://www.ektf.hu/~szlahorek/ns/movies" xmlns:mus="http://www.ektf.hu/~szlahorek/ns/music"> <mov:movie mov:type=”vigjatek" mov:year="1988"> <mov:title>Éjszakai rohanás <mov:comments> utazásos vígjáték <mus:music mus:type=”trance" mus:year=”2008"> <mus:title>Somersault <mus:artist>Chicane <mus:label>trance, club <mus:comments>koncert: 2008. június. 12.
Az XML schema (xsd)
Az XML sémák maguk is XML dokumentumok. Érdekes: mivel az XSD-k is XML dokumentumok, ezekhez is van séma, és ez a séma egy DTD séma. Minden XSD dokumentum alapja: <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
Explicit névtérdeklarációt használ! Az XSD erejét az adattípusai jelentik.
Egyszerű adattípusok (számok, dátumok, listák, stb.) Összetett adattípusok (kevert elemek, elemsorozatok) http://www.w3.org/TR/xmlschema-2/#built-in-datatypes
Elem definiálása: xs:element , attribútum definiálása: xs:attribute Pl.: <xs:element name=”name” type=”xs:string” >
Összekapcsolás:
Az XML schema – egyszerű típusok
A karakterlánc (string) típus:
A logikai típus
Szövegrészt tartalmazó elem vagy attribútum használatakor. Alakja: type=”xs:string” Pl.: Juhász Endre <xs:element name=”name” type=”xs:string” />
Igaz vagy hamis értékű elemek vagy attribútumok használatakor. Alakja: xs:boolean Pl.: <xs:attribute name=”married” type=”xs:boolean” />
Számtípusok
Numerikus értékek esetén:
xs:byte, xs:short, xs:integer, stb. : egész számok, például 3 xs:decimal : decimális számok, például 3,14 (törtrészt is tartalmazhatnak) xs:float : 32 biten ábrázolt lebegőpontos számok, például 6,0022E23 xs:double : 64 biten ábrázolt lebegőpontos számok xs:positiveInteger, xs:negativeInteger, xs:nonPositiveInteger, xs:nonNegativeInteger
Az XML schema – egyszerű típusok
Dátum és idő típusok
xs:date - "YYYY-MM-DD” alakú dátum
xs:time - "hh:mm:ss” alakú időpont
<xs:element name="start" type="xs:time"/> <start>09:00:00
xs:dateTime - "YYYY-MM-DDThh:mm:ss” alakú dátum és időpont, a T az elválasztó karakter
<xs:element name="start" type="xs:date"/> <start>2002-09-24 <start>2002-09-24-06:00
<xs:element name="startdate" type="xs:dateTime"/> <startdate>2002-05-30T09:00:00
xs:duration - "PnYnMnDTnHnMnS” alakú időtartomány
P : kötelező nY : évek száma, nM : hónapok száma, nD : napok száma T : elválasztó karakter a dátum és idő között nH : órák száma, nM : percek száma, nS : másodpercek száma <xs:element name="period" type="xs:duration"/> P5Y2M10D
Az XML schema – egyszerű típusok
Dátum és idő típusok
gDay : a dátum nap részét jelenti (DD)
gMonth : a dátum hónap részét jelenti (MM)
gMonthDay : a dátum hónap és nap részét jelenti (MM-DD)
gYear : a dátum év részét jelenti (YYYY)
gYearMonth : a dátum év és hónap részét jelenti (YYYY-MM)
Az XML schema – egyéni típusok
Az XML lehetővé teszi saját típusok létrehozását Egy típussal kapcsolatban korlátozhatjuk az értéktartományt vagy egy lista formájában megadhatjuk a felvehető értékek halmazát, stb.
A deklarációt az xs:simpleType-al kell kezdeni: <xs:simpleType name=”az új típus neve”> típusmeghatározás
Hivatk.: <xs:element name=”elemnév” type=”az új típus neve”/> Vagy: <xs:element name=”elemnév"> <xs:simpleType> típusmeghatározás
A típusmeghatározás lehet: megszorítás (xs:restriction), unió (xs:union) vagy lista (xs:list)
Az XML schema – egyéni típusok - megszorítások
Értéktartomány megszorítások:
xs:minInclusive – a legkisebb megengedett érték xs:minExclusive – a legkisebb megengedett érték (a határ nem számít bele) xs:maxInclusive – a legnagyobb megengedett érték xs:maxExclusive – a legnagyobb megengedett érték (a határ nem számít bele) Pl.: <xs:element name="age"> <xs:simpleType> <xs:restriction base="xs:integer"> <xs:minInclusive value="0"/> <xs:maxInclusive value="120"/>
Az XML schema – egyéni típusok - megszorítások
Szöveghossz megszorítások:
Teljes hossz: xs:length , megadása: xs:value Pl.: <xs:restriction base="xs:string"> <xs:length value="4"/>
Alsó, felső határ: xs:minLength, xs:maxLength Pl.: <xs:restriction base="xs:string"> <xs:minLength value="5"/> <xs:maxLength value="8"/>
Whitespace megszorítás:
xs:whiteSpace Lehetőségek:
preserve : nem törli a whitespace karaktereket replace: minden whitespace karaktert space-re cserél collapse : a induló és záró whitespace-eket törli, a többit space-re cseréli, több egymás utáni space-t eggyel helyettesít
Az XML schema – egyéni típusok - megszorítások
Felsorolás:
Csak bizonyos előre meghatározott értékeket vehetnek fel. Alakja: xs:enumeration, value=”érték” Pl.:<xs:restriction base="xs:string"> <xs:enumeration value="Audi"/> <xs:enumeration value="Golf"/> <xs:enumeration value="BMW"/>
Listák:
Egy elem vagy attribútum egymástól szóközzel elválasztott értékeket vehet fel. Alakja: xs:lista, itemType: típus Pl.: <xs:simpleType> <xs:list itemType="xs:byte"/>
Az XML schema – egyéni típusok – reguláris kifejezés
Nagyon hasznos megszorítás. Egy adott sablon szerinti felépítésű értékeket fogad el. Alakja: xs:pattern, value=”sablon” Mik használhatók a sablonban:
. (pont) – bármely karakter \d – bármely számjegy \D – bármely nem számjegy \s – bármely üres karakter \S – bármely nem üres karakter x? – az x egy vagy nulla előfordulása x+ - az x egy vagy több előfordulása x* - az x tetszőleges sok előfordulása (xy) – az x és y csoporttá kapcsolása x|y – x vagy y [xyz] – az x,y vagy z közül bármelyik [x-y] – az x és y által meghatározott tartományból bármi x{n} – az x n számú előfordulása egy sorban x{n,m} – az x legalább n, de legfeljebb m előfordulása
Az XML schema – egyéni típusok – reguláris kifejezés Példák reguláris kifejezés használatára: <xs:element name=”nem"> <xs:simpleType> <xs:restriction base="xs:string"> <xs:pattern value=”férfi|nő"/> <xs:element name=”szöveg"> <xs:simpleType> <xs:restriction base="xs:string"> <xs:pattern value="([a-z][A-Z])+"/>
<xs:pattern value="\d{2}-\d{2}-\d{3}-\d{4}"/>
Az XML schema – összetett típusok
összetett típusok létrehozása: xs:complexType
Az összetett típusokat 4 csoportba sorolhatjuk:
Üres elemek (attribútumokat tartalmaznak)
Csak elemeket tartalmazó elemek
Kevert tartalmú elemek (elemek + attribútumok)
Sorozatok és választási listák
Az XML schema – összetett típusok
üres elemek
Létrehozása: xs:complexType és xs:complexContent elemekkel Definiáljunk egy ”auto” elemet, aminek van évjárat, márka, modell attra.
<xs:element name="auto"> <xs:complexType> <xs:complexContent> <xs:extension base="xs:anyType"> /azt jelenti, hogy semelyik típus nem képezi alapját <xs:attribute name="évjárat" type="xs:positiveInteger"/> <xs:attribute name="márka" type="xs:string"/> <xs:attribute name="modell" type="xs:string"/>
Vagy
<xs:element name="auto"> <xs:complexType> <xs:attribute name="évjárat" type="xs:positiveInteger"/> <xs:attribute name="márka" type="xs:string"/> <xs:attribute name="modell" type="xs:string"/>
Az XML schema – összetett típusok
Csak elemeket tartalmazó elemek
Egyszerűen az xs:complexType segítségével tehetjük meg Pl.: <xs:element name="person"> <xs:complexType> <xs:sequence> <xs:element name="firstname" type="xs:string"/> <xs:element name="lastname" type="xs:string"/>
Kevert tartalmú elemek (elemeket és attribútumokat tartalmaz)
Létrehozása: xs:complexType és xs:simpleContent segítségével Egyes esetekben(szöveg + gyermekelem) használhatjuk az xs:complexType esetében a mixed=”true” paramétert is.
Az XML schema – összetett típusok
Kevert tartalmú elemek példa (csak szöveg, nincs gyermekelem): 123000 <xs:element name="distance"> <xs:complexType> <xs:simpleContent> <xs:extension base="xs:positiveInteger"> <xs:attribute name="units"> <xs:simpleType> <xs:restriction base="xs:string"> <xs:pattern value="miles|km"/>
Az XML schema – összetett típusok
Kevert tartalmú elemek példa (szöveg és gyermekelem), használni kell a mixed=”true” paramétert az xs:complexType-ban. sárgarépa <warranty>2008-10-12 <xs:element name="food”> <xs:complexType mixed="true"> <xs:sequence> <xs:element name="warranty" type="xs:date"/> <xs:attribute name="type" type="xs:string"/>
Az XML schema – összetett típusok
Sorozatok: A sorozatok gyermekelemek olyan listája, amely azok pontos megjelenési sorrendjét írja elő. Alakja: xs:sequence Az adott sorrendben felsoroljuk az elemeket benne. Példa: <xs:element name=”quiz”> <xs:complexType> <xs:sequence> <xs:element name=”question” type=”xs:string” /> <xs:element name=”answer” type=”xs:string” />
Alapértelmezés: 1 sorozat csak egyszer fordulhat elő egy elemen belül Használhatjuk a minOccurs és maxOccurs paramétereket Előbbieket az xs:element tagoknál is használhatjuk
Az XML schema – összetett típusok
Választások: Ha olyan elemeket akarunk létrehozni, amely választható elemek közül csak egyet tartalmazhat, akkor xs:choice-al tehetjük meg. Ekkor fel kell sorolnunk a választható elemeket. Példa: <xs:element name=„id"> <xs:complexType> <xs:choice> <xs:element name=”szemigszam" type=”xs:positiveInteger"/> <xs:sequence> <xs:element name=”name" type="xs:string"/> <xs:element name=”birthdate" type=”xs:string"/> <xs:element name="utlevelszam" type=”xs:positiveInteger"/>
Feladat egy teljes XML sémára
Készítsük el az alábbi XML fájlhoz az XSD sémát! Hege Refsnes Cecilie Tove Refsnes Hege Stale Stale Refsnes
Készítsük el a korábbi számítógépes edzéstervünk XML fájljához az XSD sémát!
Elem
El
Elem
El
Elem
El