• Keine Ergebnisse gefunden

Speicherung von XML- Dokumenten als Large Objects

N/A
N/A
Protected

Academic year: 2022

Aktie "Speicherung von XML- Dokumenten als Large Objects"

Copied!
46
0
0

Wird geladen.... (Jetzt Volltext ansehen)

Volltext

(1)

Speicherung von XML- Dokumenten als Large

Objects

(2)

Gliederung

• Einleitung

• XML Developer Kit (XDK)

• XMLTYPE

• Einsatz von Oracle Text für XML

(3)

Einleitung

• Oracle9i besitzt verschiedene

Möglichkeiten mit XML – Dokumenten umzugehen.

– Abbildung von XML – Dokumenten auf ein Datenbankschema

– Umwandlung von Anfrageergebnissen in XML – Dokumente

– Speicherung von XML – Dokumenten in

eine Tabellenspalte

(4)

Einleitung

• bei XML - Dokumenten mit statischem Inhalt wie Dokumentationen, FAQs, Büchern,

Berichten usw. ist es besser das Dokument als ganzes abzuspeichern

• Oracle9i bietet verschiedene Lösungen an, solche XML - Dokumente zu verarbeiten:

– XML Developer Kit ( XDK ) – XMLTYPE

– Oracle Text

(5)

XML Developer Kit (XDK)

• Programmierschnittstellen zur Erzeugung, Verarbeitung und Darstellung von XML – Dokumenten

• Für die Sprachen JAVA, C, C++ sowie PL/SQL verfügbar

• JAVA – Schnittstelle am weitesten ausgebaut.

Sie umfasst

– XML Parser

– XML Schema Processor

– XML Klassen Generator

(6)

XDK

XML Parser

• Es existieren zwei wichtige Modelle für den Parser:

– Document Objekt Modell (DOM)

• baumbasiertes Objektmodell

• vom W3C spezifiziert

• Ersatz für proprietäre Lösungen für DHTML

• wahlfreier Zugriff auf das gesamte Dokument möglich

– Simple Access for XML (SAX)

• ereignisbasiertes Modell

• von der XML-DEV Mailingliste spezifiziert

• nur serieller Zugriff auf das Dokument möglich

(7)

XDK

XML Parser/DOM

• einheitliche, betriebssystem- und sprachunabhängige Lösung

• objektorientierte Darstellung von Dokumenten

• mit Hilfe der Interface Definition

Language (IDL) und Beschreibungen

der Funktionen definiert.

(8)

XDK

XML Parser/DOM

Dokument in XML - Darstellung Dokument in DOM Darstellung

<TABLE>

<ROWS>

<TR>

<TD>Shady Grove</TD>

<TD>Aeolian</TD>

</TR>

<TR>

<TD>Over the River… </TD>

<TD>Dorian</TD>

</TR>

</ROWS>

</TABLE>

(9)

XDK

XML Parser/DOM Ausgehend von der

Schnittstellendefinition wird eine konkrete Knotenklasse implementiert. Diese

Knotenklasse besitzt

wiederum Zeiger die auf

Kinderknoten verweisen.

(10)

XDK

XML Parser/DOM

(11)

XDK

XML Parser/DOM

Modell Spezifikation Dokument ist ...

XML datenorientiert,

zeichenkettenorientiert formale Sprache &

Constraints Wort einer

formalen Sprache

DOM objektorientiert Interface Definition Language (IDL) &

Semantik

Menge von

Objekten und ihre

Beziehungen

(12)

XDK

XML Parser/DOM/Beispiel

<?xml version="1.0" ?>

<TABLE id="1" rows="2">

<ROWS>

<TR>

<TD>Shady Grove </TD>

<TD>Aeolian</TD>

</TR>

<TR>

<TD>Over the River, Charlie</TD>

  <TD>Dorian</TD>

</TR>

</ROWS>

</TABLE>

(13)

XDK

XML Parser/DOM/Beispiel

import java.io.*;

import org.w3c.dom.*;

import org.w3c.dom.Node;

import oracle.xml.parser.v2.*;

public class DOMTest {

static public void main(String argv[])throws Exception {

DOMParser parser = new DOMParser();

parser.parse("file:C:\\test.xml");

XMLDocument doc = parser.getDocument();

(14)

XDK

XML Parser/DOM/Beispiel

// Alle Knoten des Baumes einlesen

NodeList nl = doc.getElementsByTagName("*");

Node n;

Element e;

NamedNodeMap nnm;

for(int j=0;j<nl.getLength();j++){

e = (Element)nl.item(j);

System.out.println(e.getTagName()+":");

nnm = e.getAttributes();

if(nnm != null){

for(int i=0;i<nnm.getLength();i++){

n = nnm.item(i);

System.out.println("name="+n.getNodeName()+

" value="+n.getNodeValue());

} } } } }

(15)

XDK

XML Parser/DOM/Beispiel

Programmausgabe:

TABLE:

name=id value=1 name=rows value=2 ROWS:

TR:

TD:

TD:

TR:

TD:

TD:

(16)

XDK

XML Parser/SAX

• ereignisbasiert

• keinerlei interne Repräsentation des gesamten XML – Dokumentes

• benutzerdefinierter Handler für jedes Element

• Dokument wird seriell verarbeitet

(17)

XDK

XML Parser/SAX

3 Schritte:

1. Parser erzeugen

2. Handler erzeugen und beim Parser registrieren

3. Parsen: Parser liest das Dokument sequenziell und ruft je nach gelesenem

Element eine callback-

(18)

XDK

XML Parser/SAX

Dokument in XML - Darstellung Dokument in SAX Darstellung

<TABLE>

<ROWS>

<TR>

<TD>Shady Grove</TD>

<TD>Aeolian</TD>

</TR>

<TR>

<TD>Over the River… </TD>

<TD>Dorian</TD>

</TR>

</ROWS>

</TABLE>

start document

start element: TABLE start element: ROWS start element: TR start element: TD

start characters: Shady Grove end element: TD

start element: TD ..

.

(19)

XDK

XML Parser/SAX/Beispiel

import org.xml.sax.*;

import java.io.*;

import java.net.*;

import oracle.xml.parser.v2.*;

public class SAXSample extends HandlerBase{

// Store the Locator Locator locator;

public static void main (String args[])throws Exception

{ SAXSample sample = new SAXSample();

Parser parser = new SAXParser();

parser.setDocumentHandler(sample);

parser.setErrorHandler(sample);

parser.parse("file:C:\\test.xml");

(20)

XDK

XML Parser/SAX/Beispiel

public void setDocumentLocator (Locator locator) { System.out.println("SetDocumentLocator:");

this.locator = locator;

}

public void startDocument ()

{ System.out.println("Start Document");

}

public void endDocument () throws SAXException { System.out.println("End Document");

}

(21)

XDK

XML Parser/SAX/Beispiel

public void startElement (String name, AttributeList attrs) throws SAXException

{ System.out.print("StartElement:" + name);

int attLen;

if (attrs != null && ((attLen = attrs.getLength()) > 0)) { for (int i = 0; i < attLen; i++) {

System.out.print(" " + attrs.getName(i) + "='");

System.out.print(attrs.getValue(i) + "'");

} }

System.out.println("");

}

public void endElement (String name)

{ System.out.println("EndElement:" + name );

}

public void characters (char ch[], int start, int length) {

(22)

XDK

XML Parser/SAX/Beispiel

Programmausgabe:

SetDocumentLocator:

Start Document

StartElement:TABLE id='1' rows='2' StartElement:ROWS

StartElement:TR StartElement:TD

Characters: Shady Grove EndElement:TD

StartElement:TD

Characters: Aeolian EndElement:TD

EndElement:TR StartElement:TR ...

(23)

XDK

XML Schema

• XML –Schema wurde eingeführt um die

veralteten Document Type Definitions (DTDs) abzulösen.

• Vorteile gegenüber DTD:

– eingebaute und benutzerdefinierte Datentypen – Im- und Export von XML – Schemas

– Erweiterbarkeit

• Mit dem XDK ist es möglich, mit Hilfe eines

XML – Schemas ein XML – Dokument zu

validieren.

(24)

XDK

XML Klassen Generator

Mit Hilfe des Klassen Generators lassen sich aus einer

gegebenen DTD oder XML-Schema Java – Klassen

generieren, welche ein gültiges XML – Dokument

erzeugen.

(25)

XMLTYPE

• neuer Systemdatentyp ab Oracle9i

• Datentyp besitzt Methoden mit denen es möglich ist XML – Dokumente

– zu erzeugen

– Teildokumente zu extrahieren

• XMLTYPE-Spalten können mit Oracle

Text indiziert werden.

(26)

XMLTYPE

Beispiel/Tabelle anlegen

• Für die Erzeugung einer XMLTYPE- Spalte muss man als Datentyp

SYS.XMLTYPE angeben.

• CREATE TABLE faq_xmltype(

faq_id INT,

xml_text SYS.XMLTYPE

);

(27)

XMLTYPE

Beispiel/Datensatz einfügen

• mit Hilfe der Memberfunktion

createXML() eine XMLType Instanz erzeugen

• createXML() überprüft die Wohlgeformtheit des XML – Dokumentes

• das Dokument wird nicht validiert

(28)

XMLTYPE

Beispiel/Datensatz einfügen

INSERT INTO

faq_xmltype(faq_id, xml_text ) VALUES(

1,

SYS.XMLTYPE.createXML(

'<FAQ OWNER="Billy Text">

<TITLE>

Oracle XMLTYPE FAQ </TITLE>

...

</FAQ>')

);

(29)

XMLTYPE

Beispiel/Anfrage

SELECT

f.xml_text.extract('/FAQ/QUESTION/text()‘).getStrin gVal()

"Questions”

FROM faq_xmltype f;

Antwort:

Questions

--- Was ist der XMLType ?

Wann sollte ich XMLType und wann CLOB benutzen ?

(30)

XMLTYPE

Memberfunktionen

• createXML(xmlval IN VARCHAR2), createXML(xmlval IN CLOB)

– Konstruktoren

• existsNode(xpath IN varchar2)

• extract(xpath IN VARCHAR2)

• isFragment()

– Wahr wenn kein wohlgeformtes XML-Dokument vorliegt

• getStringVal(), getClobVal()

• getNumberVal()

(31)

XMLTYPE

Vorteile

• Einbeziehung von Xpath in die SQL – Anfrage

• hohe Performance

(32)

XMLTYPE

Nachteile

• Migration auf andere DBMS ist schwierig

• Teildokumente lassen sich nicht ändern

oder ersetzen

(33)

Oracle Text für XML

• Mit Hilfe von Oracle Text ist es möglich große Texte, welche als VARCHAR2 oder CLOB

abgespeichert sind, zu indizieren und diese effizient zu durchsuchen.

• Da es sich bei XML – Dokumenten auch um einfache Textdaten handelt, lassen sich die Indizierungs- und Suchfunktionen von Oracle Text auch auf diese anwenden.

• Oracle Text bietet außerdem noch direkte

XML – Unterstützung an.

(34)

Oracle Text für XML

Beispiel/Tabelle anlegen

• In der Tabelle wird der

Standarddatentyp CLOB benutzt.

CREATE TABLE faq_oracleText(

faq_id INT,

xml_text CLOB

);

(35)

Oracle Text für XML

Beispiel/ Datensatz einfügen

• Das XML – Dokument wird einfach als Text in die Tabelle eingefügt.

INSERT INTO faq_oracleText(faq_id, xml_text) VALUES(

1,

'<FAQ OWNER="Billy Text">

<TITLE>

Oracle XMLTYPE FAQ </TITLE>

</FAQ>‘

);

(36)

Oracle Text für XML

Beispiel/ Section Group anlegen

• Mit Hilfe der Section Group ist es möglich, nur Teile des Dokumentes zu indizieren.

• Es gibt 3 Arten von Section Groups, die für die Verarbeitung von XML – Dokumenten relevant sind:

– XML_SECTION_GROUP – AUTO_SECTION_GROUP – PATH_SECTION_GROUP

EXEC ctx_ddl.create_section_group('myxmlgroup', 

'XML_SECTION_GROUP');

(37)

Oracle Text für XML

Beispiel/ Sections hinzufügen

• Da die XML_SECTION_GROUP am Anfang noch leer ist müssen einzelne Sections

hinzugefügt werden. In dem Beispiel werden nur die Elemente TITLE und QUESTION

indiziert.

EXEC ctx_ddl.Add_Field_Section(

group_name =>'myxmlgroup',     section_name =>'title',

tag =>'TITLE');

EXEC ctx_ddl.Add_Field_Section(

group_name =>'myxmlgroup',

(38)

Oracle Text für XML

Beispiel/Anlegen des Index

• Der Index kann dann mit folgendem Statement angelegt werden:

CREATE INDEX xml_index ON  faq_oracleText(xml_text)

  INDEXTYPE IS ctxsys.context   PARAMETERS ('SECTION GROUP 

myxmlgroup');

(39)

Oracle Text für XML

Beispiel/Anfrage

• Nachdem das Dokument indiziert wurde, kann man mit Hilfe des CONTAINS –

Statements in dem Dokument nach Wörtern suchen. Mit dem WITHIN Operator kann man feststellen, ob sich das gesuchte Wort

innerhalb eines bestimmten XML – Tags befindet:

SELECT xml_text

FROM faq_oracleText

WHERE CONTAINS(xml_text, 'xmltype WITHIN 

(40)

Oracle Text für XML

Section Groups

• Für die Indizierung von XML – Dokumenten existieren drei Arten von Section - Groups:

– XML_SECTION_GROUP

– AUTO_SECTION_GROUP

– PATH_SECTION_GROUP

(41)

Oracle Text für XML

Section Groups/XML_SECTION_GROUP

• für die benutzerdefinierte Indizierung gedacht.

• bietet die größte Flexibilität

• beste Query- und Indexperformance und hat meist die kleinste Indexgröße.

• Diese Section – Group sollte man anwenden, wenn man die XML – Struktur von vornherein kennt und weiß in welchen Teilen des

Dokumentes der Benutzer am meisten sucht.

(42)

Oracle Text für XML

Section Groups/AUTO_SECTION_GROUP

• am bequemsten anzulegen, da hier das System einfach jedes XML - Element und jedes Attribut indiziert.

• Index am größten und die Performance der Querys schlechter als bei der

XML_SECTION_GROUP.

• kommt zur Anwendung, wenn man nicht

weiß, in welchen Sections der Benutzer

suchen wird.

(43)

Oracle Text für XML

Section Groups/PATH_SECTION_GROUP

• arbeitet genau so wie die AUTO_SECTION_GROUP

• Index wird auf XPath - Anfragen optimiert.

• Zugriff mit den INPATH und HASPATH

Operatoren

(44)

FAZIT

• Für die applikationsseitige Verarbeitung von XML – Dokumenten, eignet sich

das XDK am besten. Damit hat man die

größten Freiheiten XML – Dokumente

zu erzeugen, zu durchsuchen und zu

verändern.

(45)

FAZIT

• Wenn klar ist, dass sich der Inhalt der

XML – Dokumente nicht ändert und die

Dokumente hauptsächlich durchsucht

werden sollen ist Oracle Text die erste

Wahl.

(46)

FAZIT

• Der XMLTYPE ist dann einzusetzen,

wenn es sich um statische Dokumente

handelt, deren Struktur bekannt ist und

wenn man das Dokument selbst in die

Anfrage einbeziehen möchte.

Referenzen

ÄHNLICHE DOKUMENTE

43 Regel 2: Elemente dürfen sich nicht überlappen. Elemente dürfen sich

+ Unterschiedliche Realisierungen einer abstrakter Schnittstelle möglich (z.B. SOAP über HTTP und SMTP).. Nachteile

• XML-Parser sucht in CDATA lediglich , analysiert den Inhalt aber ansonsten nicht?. • “]]&gt;“ als Inhalt von CDATA nicht

ƒ Beachte: Von Browsern wird White Space allerdings nicht angezeigt:.

• Tags haben logische oder visuelle Bedeutung.. AG Netzbasierte Informationssysteme http://www.ag-nbi.de

alle Zeichen erlaubt, die nicht ausdrücklich verboten.

ƒ Für jedes Element kann ein Namensraum als Standard (default) festgelegt werden,

XSLT: nicht unbedingt nötig, da Transformation auf eigenem Server durchgeführt wird. XSLT: nicht unbedingt nötig, da Transformation auf eigenem Server