Importieren von XML-Dateien mit Java - IMN/HTWK

Werbung
Arbeitshinweise für XML-Datenbanken
1. Einrichten und Erproben des OracleXML SQL Utility (XSU)
Das OracleXML SQL Utility, der Version 1.2, welches in dem XDK for PL/SQL 8.1.7
enthalten ist, wurde auf dem Oracle-Server (goliath.imn.htwk-leipzig.de) der HTWK unter
dem User „xmluser“ installiert. Damit können die Funktionen von XSU serverseitig sowohl in
PL/SQL-Proceduren als auch in Javaklassen verwendet werden.
Mit der im XSU enthaltenen Testrotieren (oraclexmlsqltest.sql), wurde die Installation auf
ihre Betriebs- und Funktionstüchtigkeit geprüft.
sqlplus username/password@imnlehre @oraclexmlsqltesttk.sql
Das XSU kann aber auch clientseitig verwendet werden. Hierzu sind keine zusätzlichen
Zugriffsrechte nötig, da das XDK in der Datenbank nicht verwendet wird. Getestet wurde die
clientseitige Funktionstüchtigkeit mit einem Beispiel von Steve Muench, welches
entsprechend angepasst wurde. Dieses Beispiel ist im Folgenden abgedruckt.
Mit diesem SQL-Skript wurde zuerst eine Tabelle für dieses Beispiel in der Datenbank
erzeugt.
create table newsstory(
id
number primary key,
title varchar2(200),
url varchar2(200),
source varchar2(200)
);
Um den Import mit XSU zu testen wird ein entsprechendes XML-Dokument benötigt, wie es
zum Beispiel hier zu sehen ist.
File: input.xml
<?xml version="1.0"?>
<ROWSET>
<ROW>
<ID>1</ID>
<TITLE>Some Title</TITLE>
<URL>http://somemachine/somepage.html</URL>
<SOURCE>SomeSource</SOURCE>
</ROW>
</ROWSET>
Anschließend konnte der Import in die Datenbank mit XSU erfolgreich ausgeführt werden.
Dazu mussten im PC-Pool (L107) erst die entsprechenden Umgebungsvariablen gesetzt
werden und das XDK installiert werden. Die Dateien des XDK wurden in das Verzeichnis
„E:\Oracle\xdk_java_9“ kopiert. (Das XDK wurde nur zum Test auf dem Rechner Nr. 5
installiert.) Es ist aber auch möglich die XDK-Bibliotheken zu benutzen, welche mit dem
JDeveleoper installiert wurden. Diese Bibliotheken sind aber wesentlich älter als das aktuelle
XDK. Das folgende Beispiel funktionierte aber auch mit diesen Bibliotheken. Zusätzlich ist
das XDK und auch der JDBC-Treiber auf dem Netzlaufwerk N:\InformatikPool\install\ora_erw2.
Set XDK_DIR=E:\Oracle\xdk_java_9
java -classpath E:\Oracle\JDeveloper 3.1.1.2\jdbc\lib\oracle8.1.6\
classes12.zip; %XDK_DIR%\lib\xmlparserv2.jar; %XDK_DIR%\lib\xsu12.jar"
OracleXML putXML
-conn "jdbc:oracle:thin:@goliath.imn.htwk-leipzig.de:1521:imnlehre"
-user "username/password"
-fileName input.xml
newsstory
oder:
java -classpath "E:\Oracle\JDeveloper 3.1.1.2\jdbc\lib\oracle8.1.6\
classes12.zip;E:\Oracle\JDeveloper 3.1.1.2\lib\xmlparserv2.jar;
E:\Oracle\JDeveloper 3.1.1.2\lib\oraclexmlsql.jar" OracleXML putXML
-conn "jdbc:oracle:thin:@goliath.imn.htwk-leipzig.de:1521:imnlehre"
-user "username/password"
-fileName input.xml
newsstory
Output:
successfully inserted 1 rows into newsstory
Auch das Exportieren verlief ohne Fehlermeldung, sowohl mit XSU als auch mit XSQL.
java -classpath "E:\Oracle\JDeveloper 3.1.1.2\jdbc\lib\oracle8.1.6\
classes12.zip; %XDK_DIR%\lib\xmlparserv2.jar; %XDK_DIR%\lib\xsu12.jar"
OracleXML getXML
-conn "jdbc:oracle:thin:@goliath.imn.htwk-leipzig.de:1521:imnlehre"
-user "username/password"
"select * from newsstory"
oder:
java -classpath "E:\Oracle\JDeveloper 3.1.1.2\jdbc\lib\oracle8.1.6\
classes12.zip;E:\Oracle\JDeveloper 3.1.1.2\lib\xmlparserv2.jar;
E:\Oracle\JDeveloper 3.1.1.2\lib\oraclexmlsql.jar" OracleXML getXML
-conn "jdbc:oracle:thin:@goliath.imn.htwk-leipzig.de:1521:imnlehre"
-user "username/password"
"select * from newsstory"
Output:
<?xml version = '1.0'?>
<ROWSET>
<ROW num="1">
<ID>1</ID>
<TITLE>Some Title</TITLE>
<URL>http://somemachine/somepage.html</URL>
<SOURCE>SomeSource</SOURCE>
</ROW>
</ROWSET>
2. Einrichten und Testen des XML-Datei-Imports in den Datentyp Clob
Die Vorgehensweise zum Importieren von Dateien in eine Tabelle der Datenbank Oracle soll
an einem Beispiel erklärt werden. Zuerst muss eine Tabelle erzeugt werden, die eine Spalte
vom Typ Clob enthält, in welche die Dateien gespeichert werden sollen. Die Beispieltabelle
wird wie folgt angelegt:
create table xmldocs(
filename varchar2(255),
document clob,
primary key (filename)
);
Für das Importieren von Dateien in diese Tabelle stellt Oracle mehrer Möglichkeiten zur
Verfügung. Zwei davon wurden vom Autor getestet und werden hier beschrieben.
Importieren von XML-Dateien aus einem Verzeichnis heraus
Um Dateien aus einem bestimmten Verzeichnis heraus in die Datenbank zu importieren, muss
ein Verzeichnislink in der Datenbank erstellt werden. Dafür ist das Recht:
create any directory
zum Erstellen und
drop any directory
zum Löschen des Verzeichnislinks notwendig.
Erstellt wird der Verzeichnislink mit:
create directory xmlfiledir /home/david/i99/username/xmlfiles
Das im Beispiel angegebene Verzeichnis muss zuvor auf dem Datenbankserver (Goliath)
erstellt werden und es müssen auf dieses Verzeichnis leserechte für alle Benutzer erlaubt sein.
Mit der folgenden PL/SQL-Funktion kann dann eine XML-Datei importiert werden.
create or replace procedure xmlinsert (
xmldirectory in varchar2,
xmlfilename in varchar2)
as
theClob CLOB;
theBFile BFILE := BFileName(xmldirectory,xmlfilename);
begin
if (dbms_lob.fileexists(theBFile) = 1) then
-- existiert die Datei?
insert into xmldocs(filename,document) values
(xmlfilename, empty_clob()) returning document into theClob;
-- theBFile:=BFileName(xmldirectory,xmlfilename);
dbms_output.put_line('successfully insert.');
dbms_lob.fileOpen (theBFile);
dbms_output.put_line('successfully open.');
dbms_lob.loadFromFile (theClob,theBFile,dbms_lob.getLength(theBFile));
dbms_output.put_line('successfully load.');
dbms_lob.fileClose(theBFile);
commit;
dbms_output.put_line('File successfully loaded.');
else
dbms_output.put_line('File does not exist.');
-- nein: Fehlermeldung
end if;
exception
-- Exceptions fangen und Fehlermeldungen ausgeben
when
dbms_lob.noexist_directory
then
dbms_output.put_line('Directory
does not exist.');
when dbms_lob.nopriv_directory then dbms_output.put_line('You do not
have privileges for the directory.');
when dbms_lob.invalid_directory then dbms_output.put_line('Directory is
invalid.');
end;
Das Importieren aus dem oben erstellten Verzeichnis erfolgt mit:
execute xmlinsert ('xmlfiledir','othello.xml');
Importieren von XML-Dateien mit Java
Das Importieren mit Java erfolgt mit JDBC. Bevor jedoch die Datei in die Tabelle importiert
werden kann muss erst ein neuer Eintrag, mit einem leeren Clob-Objekt, in der Tabelle
erzeugt werden.
insert into xmldocs (filename, document) values ('filename.xml',
empty_clob())
Danach wird mit dem Select-Befehl das leere Objekt aus der Datenbank geholt.
SELECT document FROM xmldocs WHERE filename = 'filename.xml'
Zurückgegeben wird jedoch nur eine Referenz auf das Objekt in der Datenbank. Über diese
Referenz kann jetzt die zu importierende Datei in das Clob-Objekt geschrieben werden. Im
Rahmen dieses Werkvertrags wurde dafür ein Programm geschrieben, welches wie folgt
aufgerufen werden kann.
java -classpath ".; E:\Oracle\JDeveloper 3.1.1.2\jdbc\lib\oracle8.1.6\
classes12.zip; E:\Oracle\JDeveloper 3.1.1.2\lib\xmlparserv2.jar;"
insertxmlfile
-conn "jdbc:oracle:thin:@goliath.imn.htwk-leipzig.de:1521:imnlehre"
-user "username/password"
"othello.xml"
3. Definition der Zugriffsrechte für das Oracle XDK
Um die serverseitig installierten PL/SQL Pakete des XDK zu benutzen, muss der User
folgende Zugriffsrechte besitzen:
 XML-Parser (alle im Packet xmlparserv2.jar enthaltene Funktionen)
Zugriffsrechte auf die Pakete xmlparser, xmldom, xslprocessor des Users
„xmluser“ sind erforderlich.
Grant Execute on xmlparser to username;
Grant Execute on xmldom to username;
Grant Execute on xslprocessor to username;
 XML SQL Utility
Zugriffsrechte auf das Paket xmlgen des Users „xmluser“ sind erforderlich.
Grant Execute on xmlgen to username;
Beim installieren von XSU in die Datenbank wird allen Usern dieses Recht schon
gegeben. Es braucht also nicht noch einmal explizit gegeben werden.
Alternativ zu dem Paket xmlgen können auch die Pakete DBMS_XMLQuery und
DBMS_XMLSave definiert und verwendet werden. Diese haben zusammen die selben
Funktionen wie xmlgen.
Grant Execute on DBMS_XMLQuery to username;
Grant Execute on DBMS_XMLSave to username;
Auch für diese beiden Pakete wird beim Installieren gleich allen Usern das ExecuteRecht gegeben.
Die Erstellung und Verwendung von serverseitigen Javaklassen, welche das XDK in der
Datenbank verwenden, wurde bisher noch nicht überprüft. Vermutlich sind dafür
Zugriffsrechte auf alle im XDK enthaltene Pakete und Klassen nötig.
4. Installation der Tamino-Benutzer und Datenbanken für die Vorlesung
5. Testen der Taminoclients im PC-Pool (L107)
Der Taminoclient im PC-Pool ist vollständig installiert. Damit alle Tamino-Tools und auch
die Dokumentation richtig funktionieren muss der Internet Explorer als Standardbrowser
eingerichtet sein! Um einen Connect zur Tamino-Datenbank herzustellen, sind folgende
Angaben nötig:
Server:
Database:
http://141.57.9.57/tamino
tamtest
oder
http://timon.imn.htwk-leipzig.de/tamino
User:
Password:
Username des Sun-Pools
Passwort des Sun-Pools
revoke execute on xmlgen from tkrumbe;
Herunterladen