Speicherung von XML-Dokumenten als Large Objects

46
Speicherung von XML- Dokumenten als Large Objects

description

Speicherung von XML-Dokumenten als Large Objects. Gliederung. Einleitung XML Developer Kit (XDK) XMLTYPE Einsatz von Oracle Text für XML. Einleitung. Oracle9i besitzt verschiedene Möglichkeiten mit XML – Dokumenten umzugehen. Abbildung von XML – Dokumenten auf ein Datenbankschema - PowerPoint PPT Presentation

Transcript of Speicherung von XML-Dokumenten als Large Objects

Page 1: Speicherung von XML-Dokumenten als Large Objects

Speicherung von XML-Dokumenten als Large

Objects

Page 2: Speicherung von XML-Dokumenten als Large Objects

Gliederung

• Einleitung

• XML Developer Kit (XDK)

• XMLTYPE

• Einsatz von Oracle Text für XML

Page 3: Speicherung von XML-Dokumenten als Large Objects

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

Page 4: Speicherung von XML-Dokumenten als Large Objects

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

Page 5: Speicherung von XML-Dokumenten als Large Objects

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

Page 6: Speicherung von XML-Dokumenten als Large Objects

XDKXML 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

Page 7: Speicherung von XML-Dokumenten als Large Objects

XDKXML 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.

Page 8: Speicherung von XML-Dokumenten als Large Objects

XDKXML 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>

Page 9: Speicherung von XML-Dokumenten als Large Objects

XDKXML Parser/DOM

Ausgehend von der Schnittstellendefinition wird eine konkrete Knotenklasse implementiert. Diese Knotenklasse besitzt wiederum Zeiger die auf Kinderknoten verweisen.

Page 10: Speicherung von XML-Dokumenten als Large Objects

XDKXML Parser/DOM

Page 11: Speicherung von XML-Dokumenten als Large Objects

XDKXML 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

Page 12: Speicherung von XML-Dokumenten als Large Objects

XDKXML 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>

Page 13: Speicherung von XML-Dokumenten als Large Objects

XDKXML 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();

Page 14: Speicherung von XML-Dokumenten als Large Objects

XDKXML 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()); } } } }}

Page 15: Speicherung von XML-Dokumenten als Large Objects

XDKXML Parser/DOM/Beispiel

Programmausgabe:

TABLE:name=id value=1name=rows value=2ROWS:TR:TD:TD:TR:TD:TD:

Page 16: Speicherung von XML-Dokumenten als Large Objects

XDKXML Parser/SAX

• ereignisbasiert

• keinerlei interne Repräsentation des gesamten XML – Dokumentes

• benutzerdefinierter Handler für jedes Element

• Dokument wird seriell verarbeitet

Page 17: Speicherung von XML-Dokumenten als Large Objects

XDKXML 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-Methode in den Handlern auf.

Page 18: Speicherung von XML-Dokumenten als Large Objects

XDKXML 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: TABLEstart element: ROWSstart element: TRstart element: TDstart characters: Shady Groveend element: TDstart element: TD...

Page 19: Speicherung von XML-Dokumenten als Large Objects

XDKXML 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"); }

Page 20: Speicherung von XML-Dokumenten als Large Objects

XDKXML 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"); } 

Page 21: Speicherung von XML-Dokumenten als Large Objects

XDKXML 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) { System.out.print("Characters: "); System.out.println(new String(ch,start,length)); }}

Page 22: Speicherung von XML-Dokumenten als Large Objects

XDKXML Parser/SAX/Beispiel

Programmausgabe:

SetDocumentLocator:Start DocumentStartElement:TABLE id='1' rows='2'StartElement:ROWSStartElement:TRStartElement:TDCharacters: Shady GroveEndElement:TDStartElement:TDCharacters: AeolianEndElement:TDEndElement:TRStartElement:TR...

Page 23: Speicherung von XML-Dokumenten als Large Objects

XDKXML 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.

Page 24: Speicherung von XML-Dokumenten als Large Objects

XDKXML 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.

Page 25: Speicherung von XML-Dokumenten als Large Objects

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.

Page 26: Speicherung von XML-Dokumenten als Large Objects

XMLTYPEBeispiel/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);

Page 27: Speicherung von XML-Dokumenten als Large Objects

XMLTYPEBeispiel/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

Page 28: Speicherung von XML-Dokumenten als Large Objects

XMLTYPEBeispiel/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>'));

Page 29: Speicherung von XML-Dokumenten als Large Objects

XMLTYPEBeispiel/Anfrage

SELECT

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

"Questions”

FROM faq_xmltype f;

Antwort:

Questions----------------------------------------------Was ist der XMLType ?Wann sollte ich XMLType und wann CLOB benutzen ?

Page 30: Speicherung von XML-Dokumenten als Large Objects

XMLTYPEMemberfunktionen

• 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()

Page 31: Speicherung von XML-Dokumenten als Large Objects

XMLTYPEVorteile

• Einbeziehung von Xpath in die SQL – Anfrage

• hohe Performance

Page 32: Speicherung von XML-Dokumenten als Large Objects

XMLTYPENachteile

• Migration auf andere DBMS ist schwierig

• Teildokumente lassen sich nicht ändern oder ersetzen

Page 33: Speicherung von XML-Dokumenten als Large Objects

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.

Page 34: Speicherung von XML-Dokumenten als Large Objects

Oracle Text für XMLBeispiel/Tabelle anlegen

• In der Tabelle wird der Standarddatentyp CLOB benutzt.

 

CREATE TABLE faq_oracleText( faq_id INT, xml_text CLOB);

Page 35: Speicherung von XML-Dokumenten als Large Objects

Oracle Text für XMLBeispiel/ 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>‘

);

Page 36: Speicherung von XML-Dokumenten als Large Objects

Oracle Text für XMLBeispiel/ 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');

Page 37: Speicherung von XML-Dokumenten als Large Objects

Oracle Text für XMLBeispiel/ 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',section_name =>'question',tag =>'QUESTION');

Page 38: Speicherung von XML-Dokumenten als Large Objects

Oracle Text für XMLBeispiel/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');

Page 39: Speicherung von XML-Dokumenten als Large Objects

Oracle Text für XMLBeispiel/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_textFROM faq_oracleTextWHERE CONTAINS(xml_text, 'xmltype WITHIN question')>0;

Page 40: Speicherung von XML-Dokumenten als Large Objects

Oracle Text für XMLSection Groups

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

Page 41: Speicherung von XML-Dokumenten als Large Objects

Oracle Text für XMLSection 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.

Page 42: Speicherung von XML-Dokumenten als Large Objects

Oracle Text für XMLSection 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.

Page 43: Speicherung von XML-Dokumenten als Large Objects

Oracle Text für XMLSection 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

Page 44: Speicherung von XML-Dokumenten als Large Objects

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.

Page 45: Speicherung von XML-Dokumenten als Large Objects

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.

Page 46: Speicherung von XML-Dokumenten als Large Objects

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.