Dietze - HTWK Leipzig

Werbung
Speicherung von XMLDokumenten 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
– Umwandlung von Anfrageergebnissen in
XML – Dokumente
– Speicherung von XML – Dokumenten in
eine Tabellenspalte
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
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
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
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.
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>
XDK
XML Parser/DOM
Ausgehend von der
Schnittstellendefinition wird
eine konkrete Knotenklasse
implementiert. Diese
Knotenklasse besitzt
wiederum Zeiger die auf
Kinderknoten verweisen.
XDK
XML Parser/DOM
XDK
XML Parser/DOM
Modell
Spezifikation
Dokument ist ...
XML
datenorientiert,
formale Sprache &
zeichenkettenorientiert Constraints
Wort einer
formalen Sprache
DOM
objektorientiert
Menge von
Objekten und ihre
Beziehungen
Interface Definition
Language (IDL) &
Semantik
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>
XDK
XML Parser/DOM/Beispiel
import
import
import
import
java.io.*;
org.w3c.dom.*;
org.w3c.dom.Node;
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();
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());
}
}
}
}
}
XDK
XML Parser/DOM/Beispiel
Programmausgabe:
TABLE:
name=id value=1
name=rows value=2
ROWS:
TR:
TD:
TD:
TR:
TD:
TD:
XDK
XML Parser/SAX
• ereignisbasiert
• keinerlei interne Repräsentation des
gesamten XML – Dokumentes
• benutzerdefinierter Handler für jedes
Element
• Dokument wird seriell verarbeitet
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 callbackMethode in den Handlern auf.
XDK
XML Parser/SAX
Dokument in XML - Darstellung Dokument in SAX Darstellung
<TABLE>
start document
<ROWS>
start element: TABLE
<TR>
start element: ROWS
start element: TR
<TD>Shady Grove</TD>
start element: TD
<TD>Aeolian</TD>
start characters: Shady Grove
</TR>
end element: TD
start element: TD
<TR>
.
<TD>Over the River… </TD> .
.
<TD>Dorian</TD>
</TR>
</ROWS>
</TABLE>
XDK
XML Parser/SAX/Beispiel
import
import
import
import
org.xml.sax.*;
java.io.*;
java.net.*;
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");
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");
}
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)
{
System.out.print("Characters:
");
System.out.println(new String(ch,start,length));
}
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
...
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.
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.
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.
XMLTYPE
Beispiel/Tabelle anlegen
• Für die Erzeugung einer XMLTYPESpalte muss man als Datentyp
SYS.XMLTYPE angeben.
• CREATE TABLE faq_xmltype(
faq_id
INT,
xml_text
SYS.XMLTYPE
);
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
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>')
);
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 ?
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()
XMLTYPE
Vorteile
• Einbeziehung von Xpath in die SQL –
Anfrage
• hohe Performance
XMLTYPE
Nachteile
• Migration auf andere DBMS ist
schwierig
• Teildokumente lassen sich nicht ändern
oder ersetzen
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.
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
);
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>‘
);
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');
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',
section_name =>'question',
tag =>'QUESTION');
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');
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
question')>0;
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
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.
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.
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
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.
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.
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.
Herunterladen