XML:DB-API

Bei der XML:DB-API handelt es sich um eine Anwendungsschnittstelle, die von der XML:DB-Initiative vorgeschlagen wird. Dabei stellt sie keine weitere Schnittstelle wie DOM und SAX dar, sondern soll als einheitlicher Standard für den Zugriff auf XML-Datenbanksysteme verstanden werden, wie dies bereits mit JDBC bei relationalen Datenbanksystemen der Fall ist. Nach der Initiative soll die API in mehreren Programmiersprachen umgesetzt werden, solange diese den objektorientierten Paradigma entsprechen (vgl. Homepage der XML:DB-Initiative, 29.03.2011). Bisher ist die API lediglich in Java implementiert.

Laut Kazakos/Schmidt/Tomczyk (2002) bleibt abzuwarten, ob sich diese Schnittstelle durchsetzen wird, da nur einige wenige Unternehmen hinter dieser Initiative stehen. Die wirklich großen und bekannten Unternehmen sind hier noch nicht vertreten. Allerdings muss auch gesagt werden, dass XML-Datenbanken noch nicht populär sind.

Die API ist in Ebenen (Level) unterteilt, die jeweils mehrere Module beinhalten. Diese Einteilung soll einerseits der frühen Bereitstellung der Basisfunktionalität dienen und anderseits auch zur Klassifikation der XML-Datenbanken. Zur Zeit existieren zwei Levels (Vgl. Kazakos/Schmidt & Tomczyk, 2002, S. 136):

  1. Core Level 0: Es handelt sich hierbei um das Minimum, dass eine XML-Datenbank unterstützen muss, nämlich Zugriff auf XML-Dokument (z.B.: als DOM,über SAX oder als Text).
  2. Core Level 1: Bietet zusätzlich - zum Core Level 0 - den Zugriff auf einzelne Dienste an. Zum Beispiel: XPath und XQuery.

Beispielweise hat die native XML-Datenbank eXist? den Core-Level 1 implementiert (vgl. eXist: Feature Sheet, 29.03.2011).

Beispiel (Java & eXist):

  import org.xmldb.api.base.*;
  import org.xmldb.api.modules.*;
  import org.xmldb.api.*;

public class Beispiel {

   public static void main(String[] args){
      Collection col = null;
      try {
            /*
              Speziellen Treiber für eXist der Java Virtuellen Maschine 
              bekanntmachen, der die XML:DB-API implementiert
            */
            String driver = "org.exist.xmldb.DatabaseImpl";
            Class c = Class.forName(driver);
           /*
             Das „Database“-Objekt ermöglicht den Zugriff auf eine XML-Datenbank.
           */
            Database database = (Database) c.newInstance();
            DatabaseManager.registerDatabase(database);
            /*
             Verbindung zu einer Collection herstellen
           */
            col = DatabaseManager.getCollection("xmldb:exist://localhost:8081/"+
                                 "exist/xmlrpc/db/firmaDB","user","password");
           if(col == null) 
               System.out.println("ERROR: Es konnte keine Verbindung "+                     
                                  "hergestellt werden!");
              else
              {
                  /*
                   XPath-Ausdruck der String-Variablen “xpath_query“ zuweisen 
                 */
                String xpath_query = "//Mitarbeiter/Name/text()";
                /*
                XPath-Service erzeugen (für eine Xpath-Abfrage); den XPath-
                Ausdruck (=> Variable „xpath_query“) der Methode „query()“ 
                übergeben, die die Abfrage ausführt. Die Ergebnismenge wird im 
                Objekt vom Typ „ResourceSet“ gehalten.
                Wie der Name der Klasse „ResourceSet“ verrät, hält das Objekt 
                von diesem Typ eine Menge von „Resource“-Objekten.
              */
                XPathQueryService xpath_service = (XPathQueryService) col.getService("XPathQueryService", "1.0");
                ResourceSet resultSet = xpath_service.query(xpath_query);
                 /*
                  Das „ResurceSet“-Objekt besitzt eine Methode, die einen Iterator 
                  zurückliefert. Mit deren Hilfe wird die Ergebnismenge – innerhalb
                  der while-Schleife - durchlaufen. 
                  Das Objekt „Resource“ repräsentiert ein Datum, d.h.
                  jedes durch die Abfrage gefundene Datum, bekommt sein eigenes
                  „Resource“-Objekt. Der Inhalt eines „Resource“-Objekts kann 
                  mittels der Methode „getContent()“ erfragt werden.
                */
                ResourceIterator results = resultSet.getIterator();
                while (results.hasMoreResources()) 
                {
                  Resource res = results.nextResource();
                  System.out.println((String) res.getContent());
                }   
             }
          }
          catch (XMLDBException e) {
             System.out.println("XML:DB-ERROR: " + e.getMessage());
          } 
          catch (ClassNotFoundException e) {
    	     System.out.println("ERROR: Treiberklasse konnte nicht gefunden werden!"); 
	  } 
          catch (InstantiationException e) {
		System.out.println("ERROR: "+e.getMessage());
	  }
          catch (IllegalAccessException e) {
		e.printStackTrace();
	  }
         finally {
            if (col != null) {
              try {
		    col.close();
		  } 
              catch (XMLDBException e) {
		  System.out.println("ERROR: Verbindung konnte nicht geschlossen werden!");
             }
            }
         }
    }

}

Damit das obige Beispiel in eigenen Schritten genutzt werden kann, muss in der Umgebungsvariablen vom Betriebssystem bzw. von der Entwicklungsumgebung folgende (JAR-) Archive hinzugefügt werden: xmldb.jar, log4j-1.2.15.jar,exist.jar, xmlrpc-common-3.1.2.jar, xmlrpc-client-3.1.2.jar, xmlrpc-server-3.1.2.jar und ws-commons-util-1.0.2.jar. Diese sind im Installationsverzeichnis von eXist? (einige der JAR-Archive direkt im Installationsverzeichnisse, andere im Unterverzeichnis lib) zu finden.

Das Beispiel gibt auf der Konsole alle Textknoten von //Mitarbeiter/Name aus. Zu Deutsch: es wird eine Namensliste aller Mitarbeiter ausgegeben.

Siehe auch DOM, SAX,XML:DB-API-JavaDoc

Kategorie: XML, X

Quellen: