XML und Datenbanken
Motivation
XML-Dokumente können für sehr verschiedene Anwendungen eingesetzt werden
Aussehen der Dokumente unterscheidet sich stark
Vielzahl von Methoden zur Speicherung existiert
verschiedene Abfragemethoden
Mehrere Varianten zur Modellierung von XML-
Dokumenten und deren Struktur
Daten oder Dokumente (1)
„Lesbare Dokumente“ (dokumentzentriert)
– sind selten genau gleich strukturiert
– Reihenfolge ist wichtig
– sinntragende Daten auf allen Ebenen, viel Mixed Content
– Volltextsuche ist unabdingbar, aber nicht ausreichend
– Beispiele
Zeitschriftenbeiträge, Bücher
Gebrauchsanweisungen, Handbücher
Präsentationen
Verträge
– 70% der relevanten Geschäftsinformationen in
Daten oder Dokumente (2)
Datenzentrierte Dokumente
– wie Daten im herkömmlichen Sinn (z.B. in relationalen Datenbanken)
– Reihenfolge ist oft nicht relevant
– sind einheitlich und meist einfach strukturiert
– haben Datentypen
– sinntragende Daten in Blattelementen oder Attributen
– Mixed Content ist die Ausnahme (oder Dekoration)
– Beispiele:
Telefonbücher
wissenschaftliche Daten
Fahrpläne, Flugpläne
Bestellungen
Daten und Dokumente
Semistrukturierte Daten
– Strukturiert: Felder
– Unstrukturiert: binäre Daten wie Text, Video- und Audio-Streams, Bilder (in XML: External Entities, CDATA Sections)
– unregelmäßiges Auftreten von Hyperlinks
Mangel an Struktur
– Mischform aus datenzentriert und dokumentenzentriert
– Struktur implizit oder verborgen
– Integration von Daten aus heterogenen Quellen (hierfür strukturiertes Modell oft zu restriktiv)
– Bestimmte Anfragetypen ignorieren Schema bewußt (z.B.
Zeichenkettensuche über gesamte Datenbank hinweg)
Beispiel Krankenakten:
– Krankenakten
Daten: Geburtsdatum, Adresse, etc,
binäre Daten: Röntgenbilder
Klassifikation: Beispiel
Datenzentrierte Dokumente
(strukturiert, regulär
Beispiele: Produktkataloge, Bestellungen, Rechnungen)
Dokumentzentrierte Dokumente
(unstrukturiert, irregulär
Beispiele: wissenschaftliche Artikel, Bücher, E-Mails, Webseiten)
Semistrukturierte Dokumente
(datenzentrierte und dokumentenzentrierte Anteile
<order>
<customer>Meyer</customer>
<position>
<isbn>1-234-56789-0</isbn>
<number>2</number>
<price currency=„Euro“>30.00</price>
</position>
</order>
<content>
XML builds on the principles of two existing languages, <emph>HTML</emph> and
<emph>SGML</emph> to create a simple mechanism ..
The generalized markup concept ..
</content>
<book>
<author>Neil Bradley</author>
<title>XML companion</title>
<isbn>1-234-56789-0</isbn>
<content>
XML builds on the principles of two existing languages, <emph>HTML</emph> and ..
Warum XML in Datenbanken
XML als SGML-Nachfolger
– entstehende Dokumente müssen gespeichert werden
XML als Austauschformat
– Originaldaten werden in XML transformiert
Austauschdaten müssen aber ebenfalls gespeichert werden (z.B. beim Empfänger)
Nur die Speicherung in Datenbanken garantiert
– mächtige und effiziente Suchfunktionen
– transaktionsorientierte Speicherung
– Mehrbenutzerbetrieb
Anwendungen
– Dokumentenverwaltung
– Website-Management
– Verkaufsunterstützung
– Information Publishing
Volltextindex und XML-Index
Volltextindex Als Dateien /
Clobs
Speicherung der Dokumentstruktur
Strukturierte Speicherung in Datenbanken
Vollständiges Mapping Benutzer- definiertes
Mapping Abbilden des
DOM-Modells Abbildung der Graphstruktur
Für dokument-zentrierte XML-Dokumente
Für daten-zentrierte XML-Dokumente Für semistrukturierte XML-Dokumente
Speicherung von XML-Dokumenten
Beispiel
Speicherung mit Volltext-Index
- bekannte Methode (älter als relationale Datenbanken) - Boolesches Retrieval (AND, OR, NOT)
Verweis
Warnemünde
<adresse>
<plz>18119</plz>
<ort>Warnemünde</ort>
<nummer>12</nummer>
</adresse>
<anreisebeschreibung>
</anreisebeschreibung>
</hotel>
<hotelname>Hotel Hübner</hotelname>
Aus Richtung Rostock kommend ...
<hotel>
Begriff
anreisebeschreibung ort
Rostock hotel
<strasse>Seestraße</strasse>
Beispiel
Relationale Speicherung von XML
- DTD ist erforderlich
- Anfragen verwenden SQL - Funktionalität - Datentypen
<hotel url="www.hotel-huebner.de">
<hotelname>Hotel Hübner</hotelname>
<adresse>
<ort>Warnemünde</ort>
...
</adresse>
<preise>
<einzelzimmer>198</einzelzimmer>
</preise>
...
</hotel>
<strasse>Seestraße</strasse>
XML-Dokument HotelID Hotelname Adresse Preise
H0001 Hotel Hübner A0001 P0001
AdresseID Ort Strasse ...
A0001 Warnemünde Seestraße
PreiseID Einzelzimmer ...
P0001 198 Hotel:
Preise:
Adresse:
Beispiel
Hybride Ansätze zur Speicherung
Auswahl
unterschiedlicher
Speicherungsmethoden für verschiedene
Dokumentanteile
Hotel
0381/5434-0 Ort Strasse Telefon Strand Hotel Hübner Warnemünde Seestraße
komfortabel eingerichtetes 4-Sterne Hotel
direkt an der Strandpromenade von Warnemünde mit Blick auf Leuchtturm, Hafeneinfahrt
Sie finden unser elegant und
und Ostsee.
<hotel>
<adresse>
<plz>18119</plz>
<nummer>12</nummer>
<telefon>0381/5434-0</telefon>
</adresse>
<hausbeschreibung> Sie finden unser elegant und
</hotel>
komfortabel eingerichtetes 4-Sterne Hotel
direkt an der Strandpromenade von Warnemünde mit Blick auf Leuchtturm, Hafeneinfahrt
und Ostsee. </hausbeschreibung>
<hotelname>Strand Hotel Hübner</hotelname>
<ort>Warnemünde</ort>
<strasse>Seestraße</strasse>
XSQL
XML + SQL
Bestandteil des Oracle XDK (XML Development Kit)
XML-formatierte Ausgabe von relational
gespeicherten Daten in jedem DBMS verfügbar
Grundidee:
– relational gespeicherte Daten als XML darstellen
– Einbettung von SQL-Anweisungen in XML
– Weiterverarbeitung mittels XSL-Stylesheets möglich
Vorteile von XSQL Pages
einfache Generierung von XML-Dokumenten auf der Basis von SQL Queries
erlaubt Insert-, Update- und Delete-Operationen
unterstützt XSL Transformation durch
Anwendung von XML Stylesheets, beliebige Zielformate wie z.B. HTML
dient als Input für den XSQL Page Processor
Trennung der Daten von der Darstellung
XSQL Page Verarbeitung
Bestandteile
XSQL Pages
– SQL Queries
– DML und DDL in XML Tags
XSQL Page Processor (in Java)
– nimmt XSQL Pages als Input
– erzeugt dynamische XML Seiten mit den Ergebnissen der SQL- Queries
XSQL Servlet
– erlaubt XSQL Page Verarbeitung im Web
Erweiterbare Stylesheets
– optional
XSL Transformationen zur Formatierung des Output
Verarbeitung von XSQL Pages
<?xml version=“1.0“ ?>
<xsql:query connection=“demo“ xmlns:xsql=“urn:oracle-xsql“>
SELECT ‘Hello World‘ AS greeting FROM DUAL
</xsql:query>
<?xml version=“1.0“ ?>
<xsql:query connection=“demo“ xmlns:xsql=“urn:oracle-xsql“>
SELECT ‘Hello World‘ AS greeting FROM DUAL
</xsql:query>
XSQL Page Input
XML Output
<ROWSET>
<ROW num=“1“>
<GREETING>Hello World</GREETING>
</ROW>
</ROWSET>
<ROWSET>
<ROW num=“1“>
<GREETING>Hello World</GREETING>
</ROW>
</ROWSET>
Einführendes Beispiel
XSQL Queries und Connections
XSQL Page erlaubt die Definition von SQL Queries
Query ist eingebettet in ein xsql:query Tag
Connection-Attribut definiert die Verbindungsinformaiton zur Datenbank
Connection Name wird aufgelöst in einer
Konfigurationsdatei XSQLConfig.xml (in xsql/lib)
Beispiel
<connectiondefs>
<connection name=“demo“>
<username>xuser</username>
<password>xuser</password>
<dburl>jdbc:oracle:thin:@localhost:1521:mydb</dburl>
<driver>oracle.jdbc.driver.OracleDriver</driver>
</connection>
...
<connectiondefs>
<connection name=“demo“>
<username>xuser</username>
<password>xuser</password>
<dburl>jdbc:oracle:thin:@localhost:1521:mydb</dburl>
<driver>oracle.jdbc.driver.OracleDriver</driver>
</connection>
...
XSQL Page Processor Architektur
XSL Stylesheet
XSQL Page
XML o.a.
Formate
XSQLConfig
Datenbank XSQL Page Processor
XSLT
XML Parser
XML Utility
JDBC
Überblick über XSQL Tags
<xsql:query>
<xsql:dml>
<xsql:set-stylesheet-param>
<xsql:insert-request>
<xsql:include-xml>
<xsql:include-request-params>
<xsql:include-xsql>
<xsql:include-owa>
<xsql:action>
<xsql:ref-cursor-function>
<xsql:include-param>
<xsql:set-session-param>
<xsql:set-page-param>
Anpassung von XSQL Queries
rowset-element Elementname für Anfrageergebnis; leerer String, wenn kein Elementname gewünscht
row-element Elementname für jede Zeile im Anfrageergebnis; leerer String, wenn kein Name gewünscht
max-rows Maximalanzahl von Zeilen, die vom Ergebnis ausgegeben werden sollen, sinnvoll z.B. für Top-N-Queries
skip-rows Anzahl von Zeilen, die übersprungen werden soll vor Darstellung des Ergebnisses
id-attribute Attributname für id-Attribute für jede Zeile im Anfrageergebnis
id-attribute-
column Zu nutzender Spaltenname, um den Wert des id-Attributs in jeder Ergebniszeile zu liefern
null-indicator Wenn auf “y“ oder „“yes“ gesetzt: Null-Indicator-Attribut bei den Elementen genutzt, dessen Wert NULL ist
Attribute für xsql:query:
XSQL Query Parameter
Beispiel: Deklaration einer parametrisierten Query in einer XSQL Page
Die Parameterwerte können in einer URL geliefert werden, z.B.:
http://localhost/xsql/demo/emp.xsql?find=A&sort=SAL
<?xml version=“1.0“ ?>
<?xml-stylesheet type=“text/xsl“ href=“emp.xsl“?>
<xsql:query connection=“demo“ xmlns:xsql=“urn:oracle-xsql“>
find=“%“ sort=“ENAME“ null-indicator=“yes“>
SELECT * FROM EMP WHERE ENAME LIKE ‘%{@find}%‘
ORDER BY {@sort}
</xsql:query>
<?xml version=“1.0“ ?>
<?xml-stylesheet type=“text/xsl“ href=“emp.xsl“?>
<xsql:query connection=“demo“ xmlns:xsql=“urn:oracle-xsql“>
find=“%“ sort=“ENAME“ null-indicator=“yes“>
SELECT * FROM EMP WHERE ENAME LIKE ‘%{@find}%‘
ORDER BY {@sort}
</xsql:query>
Darstellung komplexer Strukturen
flache XML-Dateien (ROWSET/ROW)
korrespondieren mit Tupeln einer Relation
Behandlung von mehrfach geschachtelten Objekten (1:n-Beziehung)
– mehrfache Joins
– nested Cursor zur Unterscheidung zwischen übergeordnetem Objekte und Komponente
– Alternative: komplexe Objekte / Object Views
Behandlung von m:n-Beziehungen
– Auflösung von Fremdschlüsselbeziehungen
– mehrfache Darstellung der Tupel als XML-Elemente
Nested Cursor
erzeugen in SQL-Anfragen die XML-typische Baumstruktur (anstelle von Tabellen)
Beispiel:
FBEREICH STUDIENGANG SEMESTER BEZEICHNUNG
IMN IN 1 Grundlagen der Informatik
IMN IN 1 Analysis 1
Baumstruktur in XML:
IMN |-IN
|- 1.Semester
|- Grundlagen der Informatik |- Analysis 1
Beispiel Nested Cursor
Tiefe 1:
Gruppierte Auflistung aller Fachbereiche
Tiefe 2:
Auflistung der Studiengänge pro Fachbereich
Tiefe 3:
Auflistung der Semester pro Studiengang und Fachbereich
Tiefe 4:
Auflistung aller Fächer pro Semester und Studiengang und Fachbereich
Beispiel Nested Cursor (2)
Tiefe 3: Fachbereich → Studiengang → Semester
<ROWSET>
<ROW num="1">
<FBEREICH>IMN</FBEREICH>
<STUDGANG>
<STUDGANG_ROW num="1">
<STUDIENGANG>IN</STUDIENGANG>
<SEMESTER>
<SEMESTER_ROW num="1">
<SEMESTER>1</SEMESTER>
</SEMESTER_ROW>
<SEMESTER_ROW num="2">
<SEMESTER>2</SEMESTER>
</SEMESTER_ROW>
</SEMESTER>
</STUDGANG_ROW>
</STUDGANG>
</ROW>
Beispiel Nested Cursor (3)
Tiefe 3: Fachbereich → Studiengang → Semester
SQL-Befehl mit Nested Cursor (XML-Output vgl. vorige Folie)
select f.fbereich,
cursor (select fa.studiengang,
cursor (select fae.semester from faecher fae where
fae.fbereich=f.fbereich and fae.studiengang=fa.studiengang group by fae.semester) as semester
from faecher fa where fa.fbereich=f.fbereich group by fa.studiengang) as studgang
from faecher f group by f.fbereich
Kommentare:
– GROUP BY verhindert Redundanz im Baum
– in WHERE-Klausel des Cursors Referenz auf die höheren Ebenen
XSQL Tag Attribute für DML
Für alle DML-Operationen muß Zieltabelle spezifiziert werden:
Für Update und Deletes muß Key spezifiziert werden:
<xsql:insert-request table=“purchase_order“
transform=“order-to-rowset.xsl“/>
<xsql:insert-request table=“purchase_order“
transform=“order-to-rowset.xsl“/>
<xsql:update-request table=“dept“transform=“doc-to-dept.xsl“
key-columns=“deptno“/>
<xsql:update-request table=“dept“transform=“doc-to-dept.xsl“
key-columns=“deptno“/>
<xsql:delete-request table=“dept“transform=“doc-to-dept.xsl“
key-columns=“deptno“/>
<xsql:delete-request table=“dept“transform=“doc-to-dept.xsl“
key-columns=“deptno“/>
Aufruf von Stored Procedures
Stored Procedures können innerhalb von XSQL aufgerufen werden mittels <sql:dml> Tag:
Stored Procedures können in PL/SQL oder Java geschrieben sein
Calls von anonymen PL/SQL-Blöcken sind erlaubt Beispiel:
<xsql:dml>
my_package.my_procedure({@dname});
</xsql:dml>
<xsql:dml>
my_package.my_procedure({@dname});
</xsql:dml>
Aufruf XSQL Page Processor
Kommando- Zeile
Java Applikation
XSQL Servlet
Java Server Page
XSQL Page Processor
Aufruf XSQL von der Kommandozeile
Beispiel1
•
Lese Fluginformation von San Francisco mittels xsql Command Line Utility>xsql airport.xsql airport=sfo xml-stylesheet=none
Beispiel2
•
Es hängt von der XSQL Page ab, welche Aktion ausgeführt werden sollen•
Ausführung einer Insert-operation, 2. Parameter gibt die XML Quelle an, die durch XSQL Page eingefügt werden soll, dafür kann URL verwendet werden>xsql insertnewsstory.xsql
posted-xml=http://www.news.com/source
Aufruf XSQL von einem Java-Programm
Nutze oracle.xml.xsql.XSQLRequest():
public static void main (String[] args) throws Exception { // Erzeuge Instanz von XSQLRequest
URL pageUrl = new URL(“file://C:/foo/bar.xsql“);
XSQLRequest req = new XSQLRequest(pageUrl);
// Speichere Parameter in Hash-Tabelle Hashtable params = new Hashtable(3);
params.put(“param1“,“value1“);
params.put(“param2“,“value2“);
// Verarbeite die XSQL Page, übergebe die Parameter und // schreibe das Resultat in einen Out Stream
req.process(params,new PrintWriter(System.out), new PrintWriter(system.err));
}
public static void main (String[] args) throws Exception { // Erzeuge Instanz von XSQLRequest
URL pageUrl = new URL(“file://C:/foo/bar.xsql“);
XSQLRequest req = new XSQLRequest(pageUrl);
// Speichere Parameter in Hash-Tabelle Hashtable params = new Hashtable(3);
params.put(“param1“,“value1“);
params.put(“param2“,“value2“);
// Verarbeite die XSQL Page, übergebe die Parameter und // schreibe das Resultat in einen Out Stream
req.process(params,new PrintWriter(System.out), new PrintWriter(system.err));
}
XSQL Servlet Environment
Web Server mit Servlet Engine
XSQL Page Processor XSQL Servlet
http JDBC
Oracle DB Web-Browser
XSQL und Java Server Pages (JSP)
Java Server Pages
•
sind eine dokumentzentrische Art der Entwicklung von dynamischem Web Content•
werden in Servlets compiliert vor der Ausführung•
JSPs vollständig interoperabel mit Servlets (Einfügen und Weiterleiten von Output)•
JSP Tags zum Aufruf von XSQL Pages<jsp:include page=“foo.xsql“>
<jsp:forward page=„bar.xsql“>