Ugrás a fő tartalomra

XML alapok 2

 









Mezőhatároló megadási lehetőségek

•  FIXED             : Each record a fixed length (in bytes)
• VARIABLE        : Start of each record contains a character count
• DELIMITED BY : Each record ends with a given string
XMLTAG           :  Each record is the content within a given XML tag: <MYTAG>....</MYTAG>

 

 

 

XML tartalmak adatbázis kezelésére használatos SQL szerkezetek:

Oracle db-ben használatos szerkezetek

  • XMLTable     XML tartalmak táblázat szerű kezelésére
  • XMLQuery   XML tartalmak lekérdetésére (szűrés, kiválasztás, ...) eredmény is XML vagy összegzési eredmény
  • XMLTYPE    

 

Az XML file tartalmát megfelelő root (legfelső) szint kijelölésével CLOB vagy Varchar(4000) mezőbe töltjük és onnan áttöltés során megfelelően 'kiforgatjuk' egy vagy  több tábla mezőibe.

 

 

 

XQuery

Elsőként kijelöljük, hogy mely csomóponthalmazt vagy csomópontot kívánjuk feldolgozni, hogy abból információt merítsünk. A kijelölés során egy-egy változót rendelhetünk a halmazhoz vagy csomóponthoz. Halmaz esetén a megadott változó végigfut a halmaz értékein és minden értéknél elvégzi a magban megadott műveleteket.

 

Az XQuery rendelkezik programozási nyelvre és adatbázisnyelvre jellemző tulajdonságokkal is.

  • iteráció, változók (for…in, let…in)
  • rekurzív, felhasználói függvények
  • reguláris kifejezések, típusok
  • listák, tömbök


 Adatbázisos jellemzők:

  • szűrés
  • csoportosítás, összekapcsolás (joins)

 

Minta:

FOR $v IN kif1
   LET $w := kif2
WHERE kif3
ORDER BY kif4
RETURN kif5

 

Függvények

Függvény              Példa                                 Eredmény
count                    count((0,4,2))                      → 3
max                       max((0,4,2))                        → 4
subsequence         subsequence((1,3,5,7),2,3) → (3,5,7)
empty                   empty((0,4,2))                     → false()
exists                    exists((0,4,2))                      → true()
distinct-values     distinct-values((4,4,2,4))      → (4,2)
to                         (1 to 10)[. mod 2 eq 1]        → (1,3,5,7,9)

 

Online generátor : http://brettz9.github.io/xqueryeditor/

 

 

XPath

Ez egy deklaratív, kifejezés alapú lekérdező nyelv, melynek segítségével XML dokumentumokban jelölhetünk ki csomópontokat. Az XPath segítségével lehet címezni, azonosítani, mutatni és meghatározni a helyzetét az XDM-ben látott elemcsomópontoknak, attribútumcsomópontoknak, szövegescsomópontoknak és gyakorlatilag bárminek, ami előfordulhat egy XML dokumentumban. Az dokumentum logika felépítése alapján dolgozik és a csomópontok kijelölésére szolgál. Szűrhetjük az elemeket, attribútumokat különböző feltételek alapján, navigálhatunk a szülők, gyermekek között; sztringeket, számokat, logikai értékeket módosíthatunk. Támogatja a névterek használatát.

  • Az XML fában történő navigációra használjuk
  • Az XML dokumentum csúcsainak egy részhalmazát adja vissza

 

Tengelyek

XPath kifejezések csomópontok kiválasztásakor számos különböző tengely használhatnak. A tengely meghatározza az csomópontok kiválasztásának irányát a környezetcsomóponthoz viszonyítva. A tengelyek utat mutatnak, segítségükkel bejárhatunk egy XML dokumentumot. Gyakorlatilag bármely csomópontból el lehet jutni bármely csomópontba a dokumentumban a tengelyek használatával. Jelölésük: a tengely neve után ”::” operátor szerepel.

A 13 tengely a következő:

Tengely

Leírás

Irány

Látható csomópont típusok

child::

A környezetcsomópontból közvetlenül leszármazó elemek.

Forward

Elem, komment, feldolgozó utasítás és szöveg csomópontok

parent::

Közvetlenül a környezetcsomópont feletti elem.

Reverse

Gyökér, elem csomópontok

descendant::

A child:: tengely kiterjesztése. A környezetcsomópontból leszármazó elemek.

Forward

Elem, komment, feldolgozó utasítás és szöveg csomópontok

ancestor::

A parent:: tengely kiterjesztése a csomópont fán felfele.

Reverse

Gyökér, elem csomópontok

descendant-or-self::

Mint a descendant:: tengely, de tartalmazza a környezetcsomópontot.

Forward

Attribútum és névtér nem lehet.

ancestor-or-self

Mint a ancestor:: tengely, de tartalmazza a környezetcsomópontot.

Reverse

Attribútum és névtér nem lehet.

following::

Minden csomópont, ami a környezetcsomópontot követi, kivétel a leszármazottjai.

Forward

Gyökér csomópont, attribútum és névtér nem lehet.

preceding::

Minden csomópont, ami a környezetcsomópontot megelőzi, kivétel a felmenői.

Reverse

Gyökér csomópont, attribútum és névtér nem lehet.

following-sibling::

Minden csomópont, ami a környezetcsomópontot követi és közös a szülőcsomópontja.

Forward

Gyökér csomópont, attribútum és namespace nem lehet.

preceding-sibling::

Minden csomópont, ami a környezetcsomópontot megelőzi és közös a szülőcsomópontja.

Reverse

Gyökér csomópont, attribútum és namespace nem lehet.

attribute::

A környezetcsomópont attribútjai.

Forward

Csak attribútum.

namespace::

A környezetcsomópont névtere.

Forward

Csak névtér.

self::

A környezetcsomópont.

Bármelyik csomópont lehet.

 

Amikor egy XPath lépés a csomópontok egy sorozatához érkezik, csomópont tesztet hajthatunk végre, hogy szűrjük a csomópontokat jellegzetességeik és nevük alapján.

Jellegzetesség teszt

Szemantikák

Node()

Minden csomópontot elfogadunk.

Text()

Csak a szöveg csomópontokat fogadjuk el.

Comment()

Csak a megjegyzés csomópontokat fogadjuk el.

Processing-instruction()

Csak a feldolgozási utasításokat fogadjuk el.

Processing-instruction(p)

Csak a <?p…?> formájú feldolgozási utasítást fogadjuk el.

Document-node()

Csak a (láthatatlan) dokumentum gyökér csomópontot fogadjuk el.

 

 

XPath rövidítések

Rövidítés

Teljes alak

nt

child::nt

@

attribute::

..

parent::node()

//

/descendant-or-self::node()/

/

root(.)

lépés

./lépés

 

 

funkciói kategóriákra osztva

·        Hozzáférhetőségi funkciók: Ezek hozzáférést biztosítanak ahhoz hogy privát módon érhessük el az adatot, egy funkció amely engedélyezi hogy privát módon lekérdezzük és állítsuk be a tulajdonságainak értékét, anélkül hogy közvetlen hozzáférést biztosítana a tulajdonságokat tartalmazó objektumhoz. Egy csak olvasható tulajdonságnak csak egy ilyen függvénye létezik, ami engedélyezi a tulajdonság értékének a lekérdezését.

o   fn:node-name(node) – Csomópont neve

o   fn:string – Visszaadja a csomópont értékét sztringként.

o   fn:data(item [, item,…]) – Szekvenciává alakítja az elemeket,

 

·        Hibák és nyomkövetés: Hibák kiváltása, és megoldása futás közbeni nyomkövetés segítségével.

o   fn:error(error, description, object) – Kivált egy kivételt.

 

·        Konstruktorok: Ezek állítják elő az objektum példányokat egy osztályból, vagy definiálnak egy típust.

o   xs:date(), xs:string(), xs:Name(), xs:token()

 

·        Numerikus függvények: Mint bármely programozási nyelvben, egy numerikus függvény végez valamilyen konverziót illetve kalkulációt, amely után egy számot ad eredményül. Számos numerikus operátor elérhető az XPath használata közben. Rengeteg ezek közül úgy mint a „numeric-add”, elérhető a megszokottabb szimbolikus használati formája is(+).

o   fn:round(num) - Kerekítő függvény.

o   fn:abs(num) – Abszolút érték függvény.

o   fn:number(arg) – Sztringből numerikus típussá konvertál.

 

·        Szöveges függvények: A műveletek általában szövegen hajtják végre, és legtöbbször ugyanilyen típusú a visszatérési érték is, de nem minden esetben.

o   fn:concat(string [, string..]) – Összefűzi a sztringeket.

o   fn:string-length([ | string]) – A sztring hossza, vagy ha nincs megadva paraméter akkor az aktuális csomóponté.

o   fn:starts-with(string1, string2)/ fn:ends-with(string1, string2)

o   fn:contains(string1, string2) – Tartalmazza e az adott zstringet.

o   fn:replace(string, pattern, replace) – Lecseréli a sztringben az előfordulásokat.

 

·        URI függvények: URI-kat dolgoznak fel, illetve módosítanak. Az egyetlen függvény ebben a szekcióban:

o   fn:resolve-uri(relative, base) – Feloldja a relatív URI-kat abszolúttá.

 

·        Boolean függvények

o   fn:boolean(arg) – Sztring, numerikus illetve csomópont értékek boolean értéke.

o   fn:not(arg) – A boolean függvény inverze.

 

·        Idő és dátum funkciók

o   fn:dateTime(date, time) – Egy TimeStamp típusú objektumot ad vissza.

o   fn:year-from-date(date) – Az adott dátumtól számított időtartam években. Hasonló formában létezik hónapokra, napokra is.

o   fn:hours-from-time(time) - Az adott időponttól számított időtartam órákban. Hasonló formában létezik percekre, másodpercekre is.

o   fn:adjust-dateTime-to-timezone(datetime, timezone) – Egy timestamp objektumot adott időzónának megfelelőre konvertál.

§  Léteznek dátumok összegzését, kivonását, hasonlítását szolgáló függvények is.

 

·        QName funkciók: (Qualified Name) A QName egy korlátozott név. Egy QName tartalmaz egy névtér URI-t. A QName egy opcionális előtag és egy kettőspont után következik a „helyi” név vagy egy URI és a lokális vagy attribútum név.

o   fn:QName() – Visszadja a QName értékét az adott csomópontnak.

o   fn:local-name-from-QName() – A lokális nevet adja vissza a QName attribútumból.

o   fn:namespace-uri-from-QName() – Névtérrel és URI-val tér vissza.

 

·        Csomópont függvények

o   fn:name([nodeset]) – Az aktuális csomópont neve, vagy a csomópont kollekció első eleme.

o   fn:root([node]) – Visszaadja a gyökér elemet.

o   op:is-same-node – Igazat ad vissza, ha a két csomópont egyenlő.

 

·        Szekvencia funkciók: A szekvencia ténylegesen egy lista a nem létező vagy még lehetségesen ismétlődő elemek egy szülő csomóponton belül. A szekvencia ennek következtében egy kollekció. Szekvencia függvények alkalmazhatóak egy egyszerű kollekcióra teljes egészében, vagy a kollekció valamely tagjára.

o   fn:count(collection) - Kollekció elemeinek száma

o   fn:max(collection) - Kollekció elemeinek maximuma

o   fn:avg(collection) – Kollekció elemeinek átlaga

o   fn:empty(collection) – Igazat ad vissza ha üres a kollekció.

o   fn:exists(collection) – Nem üres kollekciókra igazat ad.

 

·        Tartalmi funkciók: Ezek a funkciók a jelentésekkel dolgoznak, így a meta adatokat dolgozzák fel

o   fn:last() – Megtalálja az utolsó elemet a kollekcióban.

o   fn:current-date()/fn:current-time() – Aktuális dátum illetve időpont.

o   fn:implicit-timezone() – Megtalálja az időzónára vonatkozó értéket.

 

 

Minta XML forrás szerkezet

 file: "/tmp/test1.xml" 

<employees>
  <employee><employee_number>7369</employee_number><employee_name>SMITH</employee_name><job>CLERK</job></employee>
  <employee><employee_number>7499</employee_number><employee_name>ALLEN</employee_name><job>SALESMAN</job></employee>
  <employee><employee_number>7521</employee_number><employee_name>WARD</employee_name><job>SALESMAN</job></employee>
  <employee><employee_number>7566</employee_number><employee_name>JONES</employee_name><job>MANAGER</job></employee>
  <employee><employee_number>7654</employee_number><employee_name>MARTIN</employee_name><job>SALESMAN</job></employee>
  <employee><employee_number>7698</employee_number><employee_name>BLAKE</employee_name><job>MANAGER</job></employee>
  <employee><employee_number>7782</employee_number><employee_name>CLARK</employee_name><job>MANAGER</job></employee>
  <employee><employee_number>7788</employee_number><employee_name>SCOTT</employee_name><job>ANALYST</job></employee>
  <employee><employee_number>7839</employee_number><employee_name>KING</employee_name><job>PRESIDENT</job></employee>
  <employee><employee_number>7844</employee_number><employee_name>TURNER</employee_name><job>SALESMAN</job></employee>
  <employee><employee_number>7876</employee_number><employee_name>ADAMS</employee_name><job>CLERK</job></employee>
  <employee><employee_number>7900</employee_number><employee_name>JAMES</employee_name><job>CLERK</job></employee>
  <employee><employee_number>7902</employee_number><employee_name>FORD</employee_name><job>ANALYST</job></employee>
  <employee><employee_number>7934</employee_number><employee_name>MILLER</employee_name><job>CLERK</job></employee>
</employees>

External Table (XMLTAG) : Single Tag

A legfelső szint (root egy tagcimkével történik)

Létrehozás minta

create table tab_ext (
  doc1 clob                   ---- CLOB mezőbe töltjük (ömlesztve)
)
organization external (
  type oracle_loader
  default directory tmp_dir
  access parameters (
    records
    xmltag ("employee")
    fields notrim
    missing field values are null (
      doc1 char(1000000)
    )
  )
  location ('test1.xml')
)
reject limit unlimited;
 

 

 

Áttöltéshez használat minta

select xt.*
from   tab_ext x,
       xmltable('/employee'
         passing xmltype(x.doc1)                           ---- Értelmezővel kiolvassuk (parszoljuk)
         columns 
           "employee_number" number(4)    path 'employee_number',
           "employee_name"   varchar2(10) path 'employee_name',
           "job"             varchar2(9)  path 'job'
         ) xt
order by 1;
==>
EMPLOYEE_NUMBER EMPLOYEE_N JOB
--------------- ---------- ---------
           7369 SMITH      CLERK
           7499 ALLEN      SALESMAN
           7521 WARD       SALESMAN
           7566 JONES      MANAGER
           7654 MARTIN     SALESMAN
           7698 BLAKE      MANAGER
           7782 CLARK      MANAGER
           7788 SCOTT      ANALYST
           7839 KING       PRESIDENT
           7844 TURNER     SALESMAN
           7876 ADAMS      CLERK
           7900 JAMES      CLERK
           7902 FORD       ANALYST
           7934 MILLER     CLERK

 

 

 

External Table (XMLTAG) : Multiple Tags

A legfelső szint (root több tagcimke felsorolással történik)

Létrehozás minta

---- Létrehozás
create table tab_ext (
  doc1 varchar2(4000)                                   --- Varchar(4000) nem CLOB
)
organization external (
  type oracle_loader
  default directory tmp_dir1
  access parameters (
    records
    xmltag ("employee_number", "employee_name", "job")  ---- Root szint kijelelőlése tag listával
    fields notrim
    missing field values are null
  )
  location ('test1.xml')
)
reject limit unlimited;
 

 

 

Áttöltéshez használat minta

---Nyers kilvasás
select doc1 from tab_ext;
 
DOC1
------------------------------------------------------------------------------------------------------------------------
<employee_number>7369</employee_number>
<employee_name>SMITH</employee_name>
<job>CLERK</job>
<employee_number>7499</employee_number>
<employee_name>ALLEN</employee_name>
<job>SALESMAN</job>
<employee_number>7521</employee_number>
<employee_name>WARD</employee_name>
<job>SALESMAN</job>
...

 


Megjegyzések