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.