Obsah
V současnosti (a zdá se i budoucnosti) je XQuery základním dotazovacím jazykem nad XML dokumenty.
Definován konsorciem W3C, stane se specifikací - momentálně ve stavu Last Call Working Draft, viz http://www.w3.org/XML/Query.
Založen na XPath 2.0 datovém modelu, operátorech a funkcích
Podporují ho hlavní producenti databázových strojů (IBM, MS, Oracle a další)
Ukázka zdrojového dokumentu, XQuery dotazů nad nimi a jejich výsledku.
Příklad 1. Zdrojový dokument
<?xml version="1.0" encoding="Windows-1250"?>
<addressbook>
<person category="friends">
<firstname>Petr</firstname>
<lastname>Novák</lastname>
<date-of-birth>1969-05-14</date-of-birth>
<email>novak@myfriends.com</email>
<characteristics lang="en">Very good friend</characteristics>
</person>
<person category="friends">
<firstname>Jaroslav</firstname>
<lastname>Nováèek</lastname>
<date-of-birth>1968-06-14</date-of-birth>
<email>novacek@myfriends.com</email>
<characteristics lang="en">Another good friend</characteristics>
</person>
<person category="staff">
<firstname>Jan</firstname>
<lastname>Horák</lastname>
<date-of-birth>1970-02-01</date-of-birth>
<email>horak@mycompany.com</email>
<characteristics lang="en">Just colleague</characteristics>
</person>
<person category="friends">
<firstname>Erich</firstname>
<lastname>Polák</lastname>
<date-of-birth>1980-02-28</date-of-birth>
<email>erich@myfriends.com</email>
<characteristics lang="en">Good friend</characteristics>
</person>
</addressbook>
Ukázka XQuery dotazu nad výše uvedeným zdrojovým dokumentem. Úloha: "extrakce všech příjmení v adresáři".
Dotaz je v podstatě XPath výrazem - vybere tedy všechny elementy
lastname
.
XSLT procesor Saxon je od verzí 8.x rovněž XQuery procesorem. K vykonání XQuery dotazu je třeba:
instalovat Saxon, např. 8.4b ("b" značí open-source větev)
rozbalením do adresáře - např.
c:\devel\saxon8.4b
přepnout se do tohoto adresáře: cd
c:\devel\saxon8.4b
uložit výše uvedený dotaz např. do souboru
lastnames.xq
.
výše uvedený dokument s "addressbook" uložíme do
myaddresses.xml
ve stejném adresáři.
z příkazové řádky spustit: java -classpath saxon8.jar net.sf.saxon.Query -o result.xml lastnames.xq
Uvedený XQuery dotaz vrátí do souboru
result.xml
nad zmíněným dokumentem toto:
FLWOR je zkrácené označení pro strukturu XQuery dotazů.
Úvodní část dotazu specifikuje cyklus vč. řídicí proměnné, do níž jsou postupně přiřazovány jednotlivé hodnoty vybrané XPath výrazem za klíčovým slovem "in".
V této sekci lze provést přiřazení do dalších proměnných použitelných následně.
Specifikuje selekční podmínku, tzn. které uzly (hodnoty) vybrané ve "for" budou skutečně použity.
V podmínce lze použít i proměnné vázané v sekci "let".
Takto vybrané uzly (hodnoty) lze výrazem v této sekci uspořádat.
Co bude vráceno, zkonstruováno ze získaných uzlů (hodnot).
Selekci uzlů lze specifikovat buďto přímo v XPath výrazu ve "for" nebo až v selekčním "where".
Příklad 4. FLWOR
for $person in doc('myaddresses.xml')/addressbook/person
where $person/lastname='Polák'
return $person/date-of-birth
<?xml version="1.0" encoding="UTF-8"?> <date-of-birth>1980-02-28</date-of-birth>
instalovat (rozbalit) Saxon od verze 7.x (lze i 8.x) rozbalením do libovolného adresáře
přepnout se do tohoto adresáře a
z příkazové řádky spustit: java -classpath saxon8.jar net.sf.saxon.Query -o result.xml query.xq
Specifikováno konsorciem XML:DB
Podobná koncepce jako JDBC
Rozhraní je specifikováno na poměrně abstraktní úrovni, implementační detaily jsou skryty.
Základní objekty:
Driver
- podobně jako JDBC Driver -
abstrahuje přístup ke konkrétnímu DBS, implementuje rozhraní
Database
DatabaseManager
- řídí zavádění a
správu jednotlivých ovladačů (Driver) databázových
systémů
Collection
- kolekce XML dokumentů v
databázi. Konceptuálně srovnatelné s relační tabulkou (či celou
databází). Kolekce totiž mohou být libovolně vnořené.
Services - rozhraní konkrétních služeb. Bez nich by XML:DB
takřka nemělo smysl - teprve služby definují, co databáze
„umí“. Typickou službou je např.
XPathQueryService
na vyhledávání dokumentů a
jejich částí přes XPath. Další službou je např.
XUpdateQueryService
.
Resource
- zhruba odpovídá JDBC
resource. Obecně „nějaký“ zdroj - nemusí být jen
XML, ale i binární. Je-li XML, pak např. SAX, DOM, XML
text...
Rozhraní XML:DB je pro pohodlí programátora členěno do úrovní. Vždy si jednu z nich vybereme a využíváme její nabídky:
Příklad 5. Příklad programu využívajícího XML:DB
import org.xmldb.api.base.*;
import org.xmldb.api.modules.*;
import org.xmldb.api.*;
public class Query {
public static void main(String[] args) throws Exception {
Collection col = null;
try {
String driver = null;
String prefix = null;
if ( ( args.length == 1 ) && args[0].equals("dbxml") ) {
driver = "org.dbxml.client.xmldb.DatabaseImpl";
prefix = "xmldb:dbxml:///db/";
} else {
driver = "org.xmldb.api.reference.DatabaseImpl";
prefix = "xmldb:ref:///";
}
Class c = Class.forName(driver);
Database database = (Database) c.newInstance();
if ( ! database.getConformanceLevel().equals("1") ) {
System.out.println("This program requires a Core Level 1 XML:DB " + "API driver");
System.exit(1);
}
DatabaseManager.registerDatabase(database);
col = DatabaseManager.getCollection(prefix + "addresses");
String xpath = "/address[@id = 1]";
XPathQueryService service = (XPathQueryService) col.getService("XPathQueryService", "1.0");
ResourceSet resultSet = service.query(xpath);
ResourceIterator results = resultSet.getIterator();
while (results.hasMoreResources()) {
Resource res = results.nextResource();
System.out.println((String) res.getContent());
}
} catch (XMLDBException e) {
System.err.println("XML:DB Exception occurred " + e.errorCode + " " + e.getMessage());
} finally {
if (col != null) { col.close(); }
}
}
}
Open-source referenční implementace XML:DB.
Původně nazývána dbXML.
Velmi dobré úvodní informace lze získat v Introduction to Xindice
Příklad 8. Přidání, získání, zrušení dokumentu do/z kolekce „mojedok“
Přidání souboru (-Add Document, -File [filename], -n specifikuje klíč) :
xindice ad -c /db/mojedok -f c:/devel/mojedokumenty/md.xml -n mujklic
Získání dokumentu zpět (-Retrieve Document, -File)
xindice rd -c /db/mojedok -f c:/devel/mojedokumenty/md.out.xml
Zrušení dokumentu z databáze (-Delete Document)
xindice dd -c /db/mojedok -n mujklic
eXist
je podobně jako
Xindice
open-source databáze podporující
XML:DB.
samostatně běžící (standalone) server, přístupný soketovým spojením (XML-RPC, HTTP)
jako in-process (embedded) -server běžící v témže běhu JVM jako aplikace, která jej používá
jako webová aplikace - .war archív, který se instaluje (deploy) na servletový kontejner (např. Tomcat, Jetty, Bajie...)
eXist má Jetty server přibalen v instalačním balíku, viz eXist download.
Je možno instalovat na Win NT/2000, Linuxu...
Postupujeme přesně podle instrukcí v eXist Quickstart.
Doporučuji (odzkoušeno na Win 2000 Pro):
řídit se instalačními pokyny, instalovat např. do
\devel\eXist
.
přepnout se do instalačního adresáře, otevřít Command Shell/Prompt a spustit eXist přes Jetty webový server: bin\startup.bat.
eXist ohlásí, že se spustil. Případné chybové hlášky loggeru ignorovat.
Pokud se v konfiguracích nic neměnilo, je služba eXist dostupná přes URL podobné tomuto: http://kleopatra.fi.muni.cz:8080/exist/. (tj. port 8080, cesta /exist)
Nyní můžeme vytvořit kolekci, přidat soubor, dotazovat se...
Vytvoříme kolekci mydocs
a do ní přidáme
dokument databases.xml
(tyto slidy):
Zadáme XPath dotaz, specifikujeme rozsah (ve které koleci hledat), uvedeme, kolik vyhovujících dokumentů v odpovědi vrátit.