1 / 46

Speicherung von XML-Dokumenten als Large Objects

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

iain
Download Presentation

Speicherung von XML-Dokumenten als Large Objects

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


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

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

  8. XDKXML Parser/DOM

  9. XDKXML Parser/DOM Ausgehend von der Schnittstellendefinition wird eine konkrete Knotenklasse implementiert. Diese Knotenklasse besitzt wiederum Zeiger die auf Kinderknoten verweisen.

  10. XDKXML Parser/DOM

  11. XDKXML Parser/DOM

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

  13. 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();

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

  15. XDKXML Parser/DOM/Beispiel • Programmausgabe: • TABLE: • name=id value=1 • name=rows value=2 • ROWS: • TR: • TD: • TD: • TR: • TD: • TD:

  16. XDKXML Parser/SAX • ereignisbasiert • keinerlei interne Repräsentation des gesamten XML – Dokumentes • benutzerdefinierter Handler für jedes Element • Dokument wird seriell verarbeitet

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

  18. XDKXML Parser/SAX

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

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

  21. 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)); } }

  22. 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 • ...

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

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

  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. 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);

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

  28. 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>') );

  29. 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 ?

  30. 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()

  31. XMLTYPEVorteile • Einbeziehung von Xpath in die SQL – Anfrage • hohe Performance

  32. XMLTYPENachteile • 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 XMLBeispiel/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 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>‘ );

  36. 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');

  37. 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');

  38. 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');

  39. 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;

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

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

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

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

  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.

More Related