460 likes | 574 Views
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
E N D
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
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
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.
XDKXML Parser/DOM Ausgehend von der Schnittstellendefinition wird eine konkrete Knotenklasse implementiert. Diese Knotenklasse besitzt wiederum Zeiger die auf Kinderknoten verweisen.
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>
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();
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()); } } } } }
XDKXML Parser/DOM/Beispiel • Programmausgabe: • TABLE: • name=id value=1 • name=rows value=2 • ROWS: • TR: • TD: • TD: • TR: • TD: • TD:
XDKXML Parser/SAX • ereignisbasiert • keinerlei interne Repräsentation des gesamten XML – Dokumentes • benutzerdefinierter Handler für jedes Element • Dokument wird seriell verarbeitet
XDKXML Parser/SAX • 3 Schritte: • Parser erzeugen • Handler erzeugen und beim Parser registrieren • Parsen: Parser liest das Dokument sequenziell und ruft je nach gelesenem Element eine callback-Methode in den Handlern auf.
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"); }
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"); }
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)); } }
XDKXML 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 • ...
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.
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.
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.
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);
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
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>') );
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 ?
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()
XMLTYPEVorteile • Einbeziehung von Xpath in die SQL – Anfrage • hohe Performance
XMLTYPENachteile • 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 XMLBeispiel/Tabelle anlegen • In der Tabelle wird der Standarddatentyp CLOB benutzt. CREATE TABLE faq_oracleText( faq_id INT, xml_text CLOB);
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>‘ );
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');
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');
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');
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_text FROM faq_oracleText WHERE CONTAINS(xml_text, 'xmltype WITHIN question')>0;
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
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.
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.
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
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.