Az XML dokumentumok kezeléséhez a legfontosabb az XPath ismerete.
Adjunk meg néhány XPath alapú lekérdezést -> lásd EXTRACT(XMLType, XPath) függvény
XPath kifejezésekben használható dolgok:
(. , .. , /, *, @attr, csúcsnév, [felt], // <- tetszőleges szinttel lejjebb )
[felt or felt] [felt and felt] [not(felt)] Xpath_kif | Xpath_kif
A feltételben tesztelni lehet
attribútum értékét vagy létezését -> [@att="..."], [@att]
csomópont tartalmát -> [text()="..."]
gyermek csomópont tartalmát vagy létezését -> [Csnev="..."], [Csnev]
Tengelyek, függvények
-- Adjuk meg a teljes dokumentumot (3 féle megadást is adunk)
SELECT EXTRACT(kolcs_spec, '/').getStringVal() FROM kolcsonzes;
(A gyökér elemet adtuk meg.)
SELECT EXTRACT(kolcs_spec, '*').getStringVal() FROM kolcsonzes;
(A gyökérnek az egyetlen gyermek csomópontja maga a teljes dokumentum.)
SELECT EXTRACT(kolcs_spec, '/*').getStringVal() FROM kolcsonzes;
(A teljes dokumentum a gyökérnek gyermeke.)
A fenti lekérdezések nem formázzák meg az eredményt, hanem string típusúként adják azt vissza.
Ezért abból nem is látszik a fa szerkezete. Ha az EXTRACT tagfüggvényt (MEMBER) használjuk az
alábbi módon, az megformázza az outputját.
SELECT k.kolcs_spec.EXTRACT('/').getStringVal() FROM kolcsonzes k;
-- Adjuk meg az összes csúcsot (az összes létező részfát)
SELECT EXTRACT(kolcs_spec, '//*').getStringVal() FROM kolcsonzes;
-- Adjuk meg az összes második csúcsot (az összes létező részfák 2. csúcsait)
SELECT EXTRACT(kolcs_spec, '//*[2]').getStringVal() FROM kolcsonzes;
SELECT EXTRACT(kolcs_spec, '//*[position()=2]').getStringVal() FROM kolcsonzes WHERE azon=1;
-- Adjuk meg az első kölcsönző nevét.
-----------
Gipsz Jakab
-- Adjuk meg azokat a csomópontokat, amelyeknek van 'ar' attribútuma
----------------------------------------------------------------------------------------
JegkorszakShrekUvegtigris
-- Adjuk meg a DVD csomópontok szöveges tartalmát nyitó és záró tagek nélkül
-------------------------
JegkorszakShrekUvegtigris
A fenti esetben az EXTRACT a szöveges tartalmakat összevonja egyetlen szöveges
dokumentumtöredékké.
-- Adjuk meg az összes előadót
--------------
ZoranABBAZoran
--Adjuk meg a 2600-nál olcsóbb vagy 3800-nál drágább DVD-ket
--------------------------------------------------------------
JegkorszakUvegtigris
--Adjuk meg azokat a csomópontokat, amelyeknek van 'eloado' vagy 'szerzo' attributuma
SELECT EXTRACT(kolcs_spec, '//*[@eloado or @szerzo]').getStringVal() FROM kolcsonzes;
--Adjuk meg azokat a csomópontokat, amelyeknek van 'cim' és 'szerzo' attributuma
SELECT EXTRACT(kolcs_spec, '//*[@cim and @szerzo]').getStringVal() FROM kolcsonzes;
-- Adjuk meg azokat a csomópontokat, amelyeknek nincs attribútuma
SELECT EXTRACT(kolcs_spec, '//*[not(@*)]').getStringVal() FROM kolcsonzes WHERE azon=1
-- Adjuk meg a Shrek DVD csomópontját
-----------------------------------------
Shrek
-- Adjuk meg a 'Szep Holnap' című CD árát
-------------
3000
-- Adjuk meg azoknak a CD-knek a címeit, amelyeknek ára legalább 3000
--------------------------------------------
Szep HolnapIgy alakult
-- Adjuk meg a 'Shrek' DVD árát
----
3500
--Adjuk meg a Gipsz Jakab által kölcsönzött konyvek szerzőit
-------------------------
Michael EndeFekete Istvan
-- Adjuk meg azoknak a CD-knek az előadóit, amelyeket nem Gipsz Jakab kölcsönzött
SELECT EXTRACT(kolcs_spec, '//Kolcsonzo[not(@nev="Gipsz Jakab")]//CD/@eloado').getStringVal()
FROM kolcsonzes;
--Adjuk meg azoknak a nevét, akik kölcsönöztek Zorán CD-t
--------------------
Gipsz JakabKis Virag
-- Adjuk meg azok nevét, akik kölcsönöztek könyvet
-----------
Gipsz Jakab
-- Adjuk meg azok nevét, akik kölcsönöztek könyvet vagy CD-t
--------------------
Gipsz JakabKis Virag
-- Adjuk meg a Gipsz Jakab utáni kölcsönzők nevét
SELECT EXTRACT(kolcs_spec, '//Kolcsonzo[@nev="Gipsz Jakab"]/following-sibling::*/@nev').getStringVal()
FROM kolcsonzes;
-----------------
Kis ViragNagy Pal
-- Adjuk meg a Gipsz Jakab utáni kölcsönző nevét
SELECT EXTRACT(kolcs_spec, '//Kolcsonzo[@nev="Gipsz Jakab"]/following-sibling::*[1]/@nev').getStringVal()
FROM kolcsonzes;
---------
Kis Virag
-- Adjuk meg az utolsó kölcsönző nevét (-> Nagy Pal)
-- Kik azok, akik 2 könyvet kölcsönöztek (-> Gipsz Jakab)
-- Kik azok, akik csak 1 féle dolgot kölcsönöztek (-> Nagy Pal)
-- Mely csomópontok nevében van 'r' betű?
-----------------------------------------------------------------
20002500300020003200
-- Mely csomópontnevek hossza 2?
A EXTRACTVALUE függvény annyiban különbözik az EXTRACT-tól, hogy ez csak egyetlen elemre vagy
attribútumra működik, és annak eredményét VARCHAR2-ként adja vissza.
-- A Nagy Pal által kölcsönzött egyetlen DVD elem szöveges gyermekét adja vissza
SELECT EXTRACTVALUE(kolcs_spec, '//*[@nev="Nagy Pal"]//DVD') FROM kolcsonzes;
----------
Uvegtigris
Maga a csomópont így néz ki:
SELECT EXTRACT(kolcs_spec, '//*[@nev="Nagy Pal"]//DVD').getstringval() FROM kolcsonzes;
-------------------------------
Uvegtigris