630 likes | 747 Vues
XML. Az Extensible Markup Language (XML, kiterjeszthető leíró nyelv) a W3C által ajánlott általános célú leíró nyelv speciális célú leíró nyelvek létrehozására. http://www.w3.org/XML/ Előzménye: GML (1969) G eneralized M arkup L anguage
E N D
XML • Az Extensible Markup Language (XML, kiterjeszthető leíró nyelv) a W3C által ajánlott általános célú leíró nyelv speciális célú leíró nyelvek létrehozására. http://www.w3.org/XML/ • Előzménye: • GML (1969) Generalized Markup Language • SGML (1986) Standard Generalized Markup Language • HTML (1989) HyperText Markup Language • Jelenleg két XML verzió létezik. • Az XML 1.0-t 1998-ban definiálták. • Jelenleg a 2004. február 4-én publikált harmadik kiadás az aktuális. • Ezzel egy időben adták ki az XML 1.1-et. • Magyar XML összefoglaló, és Oracle XML összefoglaló található az alábbi címen: http://ablinux.inf.elte.hu/indexxml.html
XML • Az XML jellegzetességei: • az XML dokumentum önleíró szöveges információ, • az XML dokumentumok könnyen reprezentálhatók címkézett, irányított gráfokkal, • lekérdező nyelvek a gráfokban keresnek meghatározott mintára illeszkedő útvonalakat (XPath), • a különböző funkciójú nyelvek (XQuery, XSLT, XLink, XPointer) közös része az XPath, • az adatbázis-kezelők (pl. Oracle) támogatják az XML típus kezelését, • szabványos adatcsere formátumként segít az adatintegráció megoldásában.
XML • Az adatintegráció promlémája: • különböző helyeken tárolt, különböző formátumú adatbázisokat szeretnénk egységes formátumú, egy adatbázisban látni, illetve kezelni. • A különbözőség többféle lehet: • eltérő adatmodell (relációs, objektumorientált), • különböző sémákban reprezentálhatják akár ugyanazt az információt is, • más elnevezéseket használnak (név, ügyfélnév, vevő), • más skálákat használnak (forint, euro, dollár). • Például képzeljük el különböző sörözők nyilvántartásait: • egyik helyen használnak adatbázis-kezelőt, a másik helyen meg szöveges fájlokban tárolják az információt, • egyik helyen sörös üvegeket számolnak, a másik helyen sörös ládákat, • az egyik helyen tárolják a szállító telefonszámát, a másik helyen nem, • az egyik helyen megkülönböztetik a világos és barna söröket, a másik helyen nem.
XML • Az adatintegráció kétféle megoldása: • Adattárház építése (warehousing): - egy közös sémájú adatbázisba napi, heti rendszerességgel betöltjük (szükség esetén transzformáljuk) a feldolgozáshoz szükséges adatokat. Adattárház (Warehouse) Burkoló (Wrapper) Burkoló (Wrapper) Adatforrás Adatforrás
Válasz Kérdés Alkérdés Alválasz Alkérdés Alválasz Kérdés Kérdés Válasz Válasz XML • Közvetítő használata (mediation): - az adatforrásokból egy közös nézetet (virtuális adatbázist) definiálunk, - a virtuális adatbázishoz intézett lekérdezéseket át kell fordítani az eredeti adatforrások lekérdezéseivé, és a lekérdezések eredményeit vissza kell integrálni. Közvetítő Burkoló Burkoló Adatforrás Adatforrás
XML • Az információ integráció megoldásához új adatmodellt vezetünk be, a félig (vagy részben) strukturált adatmodellt. • Az XML a félig strukturált adatmodell szabványos leíró nyelve. • A félig strukturált adatok irányított, címkézett gráffal reprezentálhatók: • Csúcsok (elemek, gyökér): objektumok, • Élek (szülő-gyerek kapcsolatok): objektumok közti kapcsolatok, • Címkék az éleken vagy csúcsokon: attribútumok, kapcsolatnevek, • Levelek (text csúcsok): atomi értéket tartalmaznak. • Megjegyzés: Az élcímkézett és csúcscímkézett modellek megfeleltethetők egymásnak. • Az adatmodell általánosítása a DOM (Document Object Model, http://www.w3.org/DOM/ ).
Sör objektum Kocsma objektum XML gyökér sör sör kocsma gyártó gyártó díj név Soproni név év helyezés kapható Szűz Ászok 1995 1. név cím Ring 5. ker
XML • Helyesen formázott XML dokumentumok • Egy XML dokumentum szövegből áll. • Egy helyesen formázott XML dokumentumnak többek között a következő szabályoknak kell megfelelnie: • Egyetlen gyökér elem lehet egy dokumentumban. Az XML deklaráció, feldolgozó utasítások és megjegyzések megelőzhetik a gyökér elemet. Ezt a részt prológusnak, az utána következő részt dokumentumpéldánynak hívjuk. • Az elemeket mind nyitó, mind záró címkének, tag-eknek kell határolni. <kocsma> </kocsma> • A tag-ek egymásba ágyazhatók, de nem lehetnek átfedők. Mindegyik nem gyökér elemet másik elemnek kell magában foglalnia.
XML <?xml version="1.0" encoding="ISO-8859-2" standalone="no"?> <Receptek> <Recept név="tea" idő="5 perc"> <összetevő mennyi="1" egység="tasak">Tea</összetevő> <összetevő mennyi="1" egység="kanál">Citromlé</összetevő> <Utasítások> <lépés>Forrald fel a vizet és tedd bele a teát!</lépés> <lépés>Tedd bele a citromlevet, majd keverd össze!</lépés> </Utasítások> </Recept> </Receptek>
XML Élcímkézett reprezentálás Receptek Tea Név Recept Idő 5 perc Összetevő Összetevő Utasítások mennyi mennyi lépés lépés egység egység kanál tasak 1 Tea 1 Citromlé Tedd bele a citromlevet, majd keverd össze! Forrald fel a vizet és tedd bele a teát!
Csúcscímkézett reprezentálás Csúcs: Attribútum: Attribútumérték: Szöveg: Gyökér XML Receptek Tea Név Recept 5 perc Idő Összetevő Összetevő Utasítások lépés lépés Citromlé egység egység Tea mennyi mennyi Tedd bele a citromlevet, majd keverd össze! Forrald fel a vizet és tedd bele a teát! kanál 1 tasak 1
XML • Érvényes XML dokumentumok • Egy helyesen formázott XML dokumentum érvényes, ha megfelel egy adott sémának. • Egy XML séma az XML dokumentum típusának, szerkezeti szabályainak leírása. • Kétféle séma használatos: • DTD (Document Type Definition) • XSD (XML Scheme Definition)
XML • XMLSpy http://www.altova.com/products/xmlspy/xml_editor.html • - (30 napos próbaverzió), • - ellenőrzi a helyesen formázottságot, érvényességet, sémát generál.
XML <?xml version="1.0" encoding="ISO-8859-2" standalone="no"?> <!DOCTYPE Receptek [ <!ELEMENT Receptek (Recept*)> <!ELEMENT Recept (összetevő*,Utasítások*)> <!ELEMENT összetevő (#PCDATA)> <!ELEMENT Utasítások (lépés*)> <!ELEMENT lépés (#PCDATA)> <!ATTLIST Recept név CDATA #IMPLIED> <!ATTLIST Recept idő CDATA #IMPLIED> <!ATTLIST összetevő mennyi CDATA #IMPLIED> <!ATTLIST összetevő egység CDATA #IMPLIED> ]> <Receptek> <Recept név="tea" idő="5 perc"> <összetevő mennyi="1" egység="tasak">Tea</összetevő> <összetevő mennyi="1" egység="kanál">Citromlé</összetevő> <Utasítások> <lépés>Forrald fel a vizet és tedd bele a teát!</lépés> <lépés>Tedd bele a citromlevet, majd keverd össze!</lépés> </Utasítások> </Recept> </Receptek>
XML • Egy XML dokumentumpéldányhoz visszafele is le lehet generálni a sémáját, de ez erre a példányra fog legjobban illeszkedni: • az aktuális értékeket tekinti az összes lehetséges értéknek, • az értékekből határozza meg a típust, és a számosságot, • így várhatóan nem lesz elég általános. <?xml version="1.0" encoding="UTF-8"?> <!--DTD generated by XMLSpy v2007 sp2 (http://www.altova.com)--> <!ELEMENT összetevő (#PCDATA)> <!ATTLIST összetevő egység (tasak | kanál)#REQUIRED mennyi CDATA #FIXED "1" > <!ELEMENT lépés (#PCDATA)> <!ELEMENT Utasítások ((lépés+))> <!ELEMENT Receptek ((Recept))> <!ELEMENT Recept ((összetevő+, Utasítások))> <!ATTLIST Recept idő CDATA #FIXED "5 perc" név CDATA #FIXED "tea" >
XML • A DTD sémát külön fájlban is lehet tárolni: <?xml version="1.0" encoding="ISO-8859-2" standalone="no"?> <!DOCTYPE Receptek SYSTEM "C:\TMP\Konyha.dtd"> <Receptek> <Recept név="tea" idő="5 perc"> <összetevő mennyi="1" egység="tasak">Tea</összetevő> <összetevő mennyi="1" egység="kanál">Citromlé</összetevő> <Utasítások> <lépés>Forrald fel a vizet és tedd bele a teát!</lépés> <lépés>Tedd bele a citromlevet, majd keverd össze!</lépés> </Utasítások> </Recept> </Receptek>
XML • Az XML fájl böngészővel is megnyitható, és az alstruktúrák kinyithatók a – jelekre kattintva, illetve összecsukhatók még egy kattintással. • A konyha.xml fájlt Internet Explorerrel megnyitva: <?xml version="1.0" encoding="ISO-8859-2" standalone="no" ?> <!DOCTYPE Receptek (View Source for full doctype...)> - <Receptek> - <Recept név="tea" idő="5 perc"> <összetevő mennyi="1" egység="tasak">Tea</összetevő> <összetevő mennyi="1" egység="kanál">Citromlé</összetevő> - <Utasítások> <lépés>Forrald fel a vizet és tedd bele a teát!</lépés> <lépés>Tedd bele a citromlevet, majd keverd össze!</lépés> </Utasítások> </Recept> </Receptek>
XML • Az XSD sokkal részletesebb, mint a DTD. • A generált Konyha.xsd 73 sor, a Konyha.dtd 15 sor. • A Konyha.xsd első pár sora: ?xml version="1.0" encoding="UTF-8"?> <!--W3C Schema generated by XMLSpy v2007 sp2 (http://www.altova.com)--> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> <xs:simpleType name="T3_összetevő"> <xs:restriction base="xs:string"> <xs:enumeration value="Citromlé"/> <xs:enumeration value="Tea"/> </xs:restriction> </xs:simpleType> <xs:element name="Receptek"> <xs:complexType> <xs:sequence> <xs:element name="Recept"> <xs:complexType> <xs:sequence> s.t.b.
XML • A sémát is gráffal lehet reprezentálni. • A konyha.png tartalma:
XML • Az XPath (http://www.w3.org/TR/xpath) lekérdezőnyelv reguláris kifejezésekre illeszkedő útvonalakat keres. • Példák: http://www.zvon.org/xxl/XPathTutorial/General/examples.html • 1999-ben készült az 1.0 verzió. • 2007. januárban jelent meg a 2.0 verzió. • A reguláris kifejezésben használt fontosabb jelölések:
XML • /Receptek/Recept/@név eredménye: név attribútum, értéke: tea • //összetevő[@mennyi=1] eredménye: összetevő csúcs, értéke: Tea összetevőcsúcs, értéke: Citromlé • /Receptek/Recept/Utasítások/* eredménye: lépés csúcs, értéke: Forrald fel a vizet ... lépéscsúcs, értéke: Tedd bele a citromlevet...
XML • //Utasítások | /Receptek/Recept eredménye: Recept csúcs Utasítások csúcs • //*[@mennyi] -- létezik a csúcsnak mennyi attribútuma -- eredménye: összetevő csúcs, értéke: Tea összetevőcsúcs, értéke: Citromlé • //Utasítások/lépés[2] – a 2. lépés csúcs – eredménye: lépés csúcs, értéke: Tedd bele a citromlevet... • //Recept[@név="tea" and összetevő="Citromlé"]//lépés eredménye: lépés csúcs, értéke: Forrald fel a vizet ... lépéscsúcs, értéke: Tedd bele a citromlevet...
XML • /*/* eredménye: Recept csúcs • /*/*/* eredménye: összetevő csúcs, értéke: Tea összetevőcsúcs, értéke: Citromlé Utasítások csúcs • /*/*/*/parent::*-- az aktuális csúcs szülője -- eredménye: Recept csúcs • Fontosabb tengelyek (axes):
XML • Az XPath lekérdezésekben függvények is használhatók: http://www.w3schools.com/xpath/xpath_functions.asp Fontosabb függvényosztályok: • Accessor Például:/Receptek/Recept/node-name(.) Eredménye: xs:QName, értéke: Recept • Numeric Például:/Receptek/Recept/összetevő[@egység="kanál"]/@mennyi+3.14/round(.) Eredménye: xs: Double, értéke:4 • String Például:/Receptek/Recept/összetevő[@egység="kanál"]/string-length(.) Eredménye: xs: Integer, értéke:8 Másik példa: /Receptek/Recept/összetevő[@egység="tasak"]/upper-case(.) Eredménye: xs: string, értéke: TEA
XML • AnyURI Például: /resolve-uri(".\Példa") Eredménye: xs: anyURI, értéke: C:\TMP\Példa • Boolean Például: //összetevő[@egység="tasak"]/@mennyi="1" and false() Eredménye: xs: boolean, értéke false • Duration/Date/Time Például: //lépés/current-date() Eredménye (-- időzónával együtt --): xs: date, értéke: 2007-04-24+02:00 xs: date, értéke: 2007-04-24+02:00 • QName (qualified name) Például: //Recept/namespace-uri(.) Eredménye: xs: anyURI, értéke üres
XML • Node Például: Például: //Recept/namespace-uri(.) Eredménye: xs: string, értéke "összetevő" xs: string, értéke "összetevő" xs: string, értéke "Utasítások" További függvényosztályok: • Sequence • Context • Error and Trace • Elnevezéseket névterek segítségével lehet egyedivé tenni. A névterek után : jelet teszünk. Előre deklarált névterek: • xml = http://www.w3.org/XML/1998/namespace • xs = http://www.w3.org/2001/XMLSchema • xsi = http://www.w3.org/2001/XMLSchema-instance • fn = http://www.w3.org/2005/xpath-functions • local = http://www.w3.org/2005/xquery-local-functions
XML • Az XQuery lekérdező nyelv: • SQL-hez hasonló: • FLOWR kifejezések: • FOR, LET, WHERE, ORDER BY, RETURN. • XML-ben az adatelérést XPath kifejezéssel lehet megadni, • az XQuery 1.0 2007. január 23 óta W3C ajánlás • az adatbázis-kezelők (pl. Oracle) támogatják • Alkalmazási területek: • információ kinyerése XML fájlokból, • jelentések készítése, • XML adatok átalakítása XHTML formátumra, • weben publikált adatokon keresés • web service alkalmazások megvalósítása.
XML • Változók használata: • $változó • Például: • xqueryversion"1.0"; for$xindoc("konyha.xml")//összetevő orderby$x/@egység return$x Eredménye XML dokumentum: <összetevő mennyi="1" egység="kanál">Citromlé</összetevő> <összetevő mennyi="1" egység="tasak">Tea</összetevő>
XML • HTML dokumentum is generálható a segítségével Például a konyha.xq fájl legyen a következő: xqueryversion"1.0"; <html> <body><h1>Összetevők</h1> <ul> { for$xindoc("konyha.xml")//összetevő let$valami :="kanál" where$x/@egység=$valami return<li>{$x/text()}</li> } </ul> </body> </html>
XML • Az előbbi XQuery eredménye: <html> <body> <h1>Összetevők</h1> <ul> <li>Citromlé</li> </ul> </body> </html> Az eredményt elmentve Konyha.html fájlba és böngészővel megnyitva:
XML • Ha a lekérdezés eredménye több elemet tartalmaz, külön sorokba jeleníthetjük meg az elemeket, és rendezhetjük is: xqueryversion"1.0"; <html> <body><h1>Összetevők</h1> <ul> { for$xindoc("konyha.xml")//összetevő orderby$x/@egység return<li> {$x/text()} </li> } </ul> </body> </html>
XML • Az előbbi XQuery eredménye: <html> <body> <h1>Összetevők</h1> <ul> <li>Citromlé</li> <li>Tea</li> </ul> </body> </html> • Böngészővel megnyitva:
XML • Az XPath összes függvénye mellett más beépített függvények is használhatók, és új függvényeket is meg lehet adni. • Például a sum(doc("konyha.xml")//összetevő/@mennyi) eredménye 2. • A következő rekurzív függvény kiszámolja a megadott XML dokumentum gráfjának mélységét. xqueryversion"1.0"; declarefunction local:depth($easnode()) as xs:integer { (: Ha nincs gyereke egy csúcsnak, akkor a mélysége 1 :) (: Különben 1-gyel nagyobb a mélysége, mint a gyerekei mélységeinek maximuma :) if (fn:empty($e/*)) then 1 else fn:max(for$cin$e/* return local:depth($c)) + 1 }; local:depth(fn:doc("Konyha.xml")) • Eredménye: 5 • A local:depth(fn:doc("Konyha.xml")/Receptek/Recept/Utasítások/lépés[1]) Eredménye: 1
XML • Az Oracle adatbázis-kezelő különböző verziói egyre bővülő XML támogatást nyújtanak. • A legfontosabb fogalmak összefoglalva (a címke, vagy tag jelentik a gráf egy csúcsát):