XML und Datenbanken
Transcription
XML und Datenbanken
Kapitel 3 XML-Prozessoren DOM Document Object Model SAX Simple API for XML Verarbeitung von XML z Anforderungen – – z Suchen und Ändern in bzw. von XML-Dokumenten gewünscht Schnittstellen für Anwendungen, die Information in Form von XMLDokumenten verwalten und verarbeiten XML-Prozessoren machen den Inhalt eines XML-Dokuments für Anwendungen verfügbar – – Parsen des Dokuments und Auflösen von Entities Überprüfen der Gültigkeit und Schemakonformität z XML-Prozessoren bieten standardisierte Schnittstellen für zahlreiche Programmiersprachen, z.B. Java, Phyton, C, C++, ... z Arten von XML-Prozessoren: – – → Baumorientiert (DOM) Ereignisorientiert (SAX) beide sind jedoch prozedural! Vorlesung "XML und Datenbanken" - WS 2003/2004 (Dr. C. Türker) XML-Anwendung XML-Prozessor (XML-Engine) ? 3-2 Document Object Model (DOM) z DOM – – – z Objektorientierte Sicht auf XML-Dokumente – – – z beschreibt ausschliesslich Schnittstellen (APIs) zum Zugriff auf XMLDokumente und zur Veränderung von Struktur und Inhalten definiert nicht die zugrunde liegende Implementierung und Speicherung der XML-Dokumente W3C Recommendation XML-Dokumente intern als Bäume repräsentiert unterschiedliche Knotentypen: Element, Attribut, etc. Methoden zur Traversierung und Manipulation der Baumstruktur Es gibt zahlreiche DOM-Implementierungen, z.B. – – – Java (+ XML-Parser) JavaScript und Web-Browser C++-Bibliotheken Vorlesung "XML und Datenbanken" - WS 2003/2004 (Dr. C. Türker) 3-3 DOM – Illustration <?xml version="1.0"?> <bookstore> <book price='8.99'> <title> The Autobiography of Benjamin Franklin </title> <author> Benjamin Franklin </author> </book> </bookstore> bookstore Knoten vom Typ: DOCUMENT book Knoten vom Typ: ELEMENT Knoten vom Typ: ATTR title The Autobiography of Benjamin Franklin author Benjamin Franklin price 8.99 Knoten vom Typ: TEXT Vorlesung "XML und Datenbanken" - WS 2003/2004 (Dr. C. Türker) 3-4 Verarbeitung von XML: DOM XML-Anwendung XML-Prozessor (XML-Engine) DOMMethoden z Anwendung behält Kontrolle über den Ablauf z Zugriff erfolgt mit den von DOM standardisierten Methoden Vorlesung "XML und Datenbanken" - WS 2003/2004 (Dr. C. Türker) 3-5 DOM-Schnittstellenhierarchie DOMImplementation Node NodeList NamedNodeMap Attr CharacterData Comment Text CDataSection Document DocumentFragment DocumentType DOM spezifiziert nur Schnittstellen DOM-Anwender muss sich eine Klassenbibliothek besorgen, die diese Schnittstellen implementiert Element Entity EntityReference Notation ProcessingInstruction Vorlesung "XML und Datenbanken" - WS 2003/2004 (Dr. C. Türker) 3-6 DOM-Schnittstelle "Node" (1) z definiert Methoden zur – – – Identifikation des Knotentyps Navigation durch die Dokumentstruktur Manipulation der Dokumentstruktur interface Node { // Attributdefinitionen readonly attribute DOMString readonly attribute unsigned short readonly attribute Node readonly attribute NodeList readonly attribute NamedNodeMap nodeName; nodeType; parentNode; childNodes; attributes; // Methodendeklarationen (siehe nächste Folie) … } Vorlesung "XML und Datenbanken" - WS 2003/2004 (Dr. C. Türker) 3-7 DOM-Schnittstelle "Node" (2) // Ausgewählte der Methoden der Schnittstelle Node // Lesende Methoden Node get_documentElement() // liefert das Wurzelelement NodeList get_childNodes() // liefert alle Kindknoten Node get_firstChild() // liefert ersten Kindknoten Node get_lastChild() // liefert letzten Kindknoten Node get_parentNode() // liefert Elternknoten Node get_nextSibling() // liefert nächsten Geschwisterknoten Node get_previousSibling() // liefert vorhergehenden Geschwisterknoten unsigned short get_nodeType() // liefert Knotentyp DOMString get_nodeValue() // liefert assoziierten Knotenwert // Änderungsmethoden Node appendChild(Node neu) // hängt Kindknoten an Node insertBefore(Node neu, Node alt) // fügt Kindknoten vor einen anderen ein Node removeChild(Node alt) // entfernt spezifizierten Kindknoten Node replaceChild(Node neu, Node alt) // ersetzt Kindknoten durch einen anderen Vorlesung "XML und Datenbanken" - WS 2003/2004 (Dr. C. Türker) 3-8 DOM-Methoden zur Navigation durch das Dokument Ausgehend vom Knoten liefern folgende Methoden der Klasse Node die Knoten bzw. Knotenlisten als Ergebnis: 1 - getParentNode() 1 2 - getFirstChild() 5 4 6 2 3 Vorlesung "XML und Datenbanken" - WS 2003/2004 (Dr. C. Türker) 3 - getLastChild() 4 - getChildren() 5 - getPreviousSibling() 6 - getNextSibling() 3-9 DOM-Methoden zur Manipulation eines Dokuments A insertBefore(K, G) B F K A D B G F D G K appendChild(K) A B D F G replaceChild(G, K) A removeChild(G) B A D F Vorlesung "XML und Datenbanken" - WS 2003/2004 (Dr. C. Türker) B D F K 3-10 DOM-Schnittstellen "Element" und "Attr" interface Element : Node { // Attributdefinitionen readonly attribute DOMString tagName; } // Methodendeklarationen DOMString getTagName() // liefert Tagnamen eines Elementes Attr getAttributeNode(DOMString name) // liefert angegebenes Attribut Attr setAttributeNode(Attr neu) // setzt bzw. fügt neues Attribut ein Attr removeAttributeNode(Attr alt) // löscht spezifiziertes Attribut NodeList getElementsByTagName(DOMString name) // liefert alle Elemente, die den // spezifizierten Elementnamen haben … interface Attr : Node { // Attributdefinitionen readonly attribute DOMString name; attribute DOMString value; readonly attribute boolean specified; readonly attribute Element ownerElement; readonly attribute TypeInfo schemaType; } Vorlesung "XML und Datenbanken" - WS 2003/2004 (Dr. C. Türker) 3-11 DOM-Schnittstelle "CharacterData" interface CharacterData : Node { // Attributdefinitionen attribute DOMString data; readonly attribute unsigned long length; // Methodendeklarationen substringData(start, count) appendData(text) replaceData(offset, count, text) insertData(offset, text) deleteData(offset, count) // liefert Teil der Zeichenkette // hängt Text an die Zeichenkette an // ersetzt Teil der Zeichenkette // fügt Text in die Zeichenkette ein // löscht Teil der Zeichenkette } Vorlesung "XML und Datenbanken" - WS 2003/2004 (Dr. C. Türker) 3-12 DOM-Schnittstelle "Document" interface Document : Node { // Attributdefinitionen readonly attribute DocumentType doctype; readonly attribute DOMImplementation implementation; readonly attribute Element documentElement; attribute DOMString documentURI; } z // Methodendeklarationen Element DocumentFragment Text Comment CDATASection Attr EntityReference NodeList Element … createElement(in DOMString tagName); createDocumentFragment(); createTextNode(in DOMString data); createComment(in DOMString data); createCDATASection(in DOMString data); createAttribute(in DOMString name); createEntityReference(in DOMString name); getElementsByTagName(in DOMString tagname); getElementById(in DOMString elementId); Neue Objekte werden mit bereits gezeigten Methoden in den Baum eingefügt Vorlesung "XML und Datenbanken" - WS 2003/2004 (Dr. C. Türker) 3-13 DOM-Anwendung (1) // This file demonstrates a simple use of the parser and DOM API. The XML file that is given // to the application is parsed and the elements and attributes in the document are printed. // The use of setting the parser options is demonstrated. import java.io.*; import java.net.*; import org.w3c.dom.*; import org.w3c.dom.Node; import oracle.xml.parser.v2.DOMParser; public class DOMSample { static public void main(String[] argv) { DOMParser parser = new DOMParser(); URL url = createURL(argv[0]); // get an instance of the parser // generate a URL from the filename parser.setErrorStream(System.err); parser.setValidationMode(true); parser.showWarnings(true); // set various parser options: error stream set to stderr // validation on // warnings shown parser.parse(url); Document doc = parser.getDocument(); // parse the document // obtain the document System.out.print("The elements are: "); printElements(doc); // print document elements System.out.println("The attributes of each element are: "); printElementAttributes(doc); // print document element attributes } // go on with the next foil Vorlesung "XML und Datenbanken" - WS 2003/2004 (Dr. C. Türker) 3-14 DOM-Anwendung (2) static URL createURL(String fileName) { URL url = null; // here we omit the checking whether // the filename is a correct path expression url = new URL(fileName); return url; } static void printElements(Document doc) { NodeList nl = doc.getElementsByTagName("*"); Node n; for (int i=0; i<nl.getLength(); i++) { n = nl.item(i); System.out.print(n.getNodeName() + " "); } System.out.println(); } // go on with the right column static void printElementAttributes(Document doc) { NodeList nl = doc.getElementsByTagName("*"); Element e; Node n; NamedNodeMap nnm; String attrname; String attrval; int i, len; len = nl.getLength(); for (int j=0; j < len; j++) { e = (Element)nl.item(j); System.out.println(e.getTagName() + ":"); nnm = e.getAttributes(); if (nnm != null) { for (i=0; i<nnm.getLength(); i++) { n = nnm.item(i); attrname = n.getNodeName(); attrval = n.getNodeValue(); System.out.print(" " + attrname + " = " + attrval); } } System.out.println(); } } } // end class DOMSample Vorlesung "XML und Datenbanken" - WS 2003/2004 (Dr. C. Türker) 3-15 Simple API for XML (SAX) z Vorgehensweise: – – – – – z XML-Engine kontrolliert den Ablauf – z XML-Engine liest sequentiell den Eingabestrom (Dokument) prüft die Korrektheit und ruft Callback-Methoden bei Eintreten von Ereignissen auf, z.B. wenn ein Beginoder End-Tag abgearbeitet wird Anwendung kann auf diese Ereignisse reagieren oder sie ignorieren Anwendungsprogrammierer muss "Event-Handler" für die Callback-Methoden implementieren, an deren Ereignisse er interessiert ist triggert Anwendung durch Aufruf von Callback-Methoden SAX – – standardisiert die Schnittstellen der Callback-Methoden erleichtert das Vermeiden einer mehrfachen internen Repräsentationen eines XML-Dokuments, da nur temporäre Strukturen für Ereignisse benötigt werden Vorlesung "XML und Datenbanken" - WS 2003/2004 (Dr. C. Türker) 3-16 Verarbeitung von XML: SAX XML-Anwendung Aufruf für XML-Dokumente XML-Prozessor (XML-Engine) CallbackMethoden Callback-Methoden: XML-Prozessor hält Kontrolle Vorlesung "XML und Datenbanken" - WS 2003/2004 (Dr. C. Türker) 3-17 SAX-Architektur Handler #1 Handler #2 ... Parser Ereignisstrom Dispatcher Auslösende Muster ("Trigger") Callback, mit dem Ereignis als Parameter Handler #n Anwendungsprogramm Anmeldung der Handler Ereignisse sind das Vorkommen der XML-spezifischen Konstrukte, z.B. Elemente, Text-Bestandteile, Kommentare Vorlesung "XML und Datenbanken" - WS 2003/2004 (Dr. C. Türker) 3-18 Beispiel: XML-Baum-Traversierung startDocument() <?xml version="1.0"?> <book price=‘8.99‘> <title> The Autobiography of Benjamin Franklin startElement("book", AttributeList(length=1, {name='price', type='PCDATA', value='8.99'}) startElement("title", null) characterData("The Autobiography of Benjamin Franklin", start, length) </title> endElement("title") <author> startElement("author", null) <first-name> Benjamin startElement("first-name", null) characterData(Benjamin", start, length) </first-name> endElement("first-name") <last-name> startElement("last-name", null) Franklin </last-name> </author> </book> character("Franklin", start, length) endElement("last-name") endElement("author") endElement("book") endDocument() Vorlesung "XML und Datenbanken" - WS 2003/2004 (Dr. C. Türker) Abarbeitungsreihenfolge ist fest vorgegeben, wir können nicht z.B. auf Breitensuche umschalten 3-19 SAX-Schnittstellen z Schnittstellen für Parser-Implementierer – – – z Parser: Registrierung von Event-Handler für Callbacks AttributeList: Iteration durch eine Attributliste Locator: Positionierung im XML-Dokument Schnittstellen für Anwendungsentwickler – – – – DocumentHandler: Implementierung von Event-Handler-Methoden ErrorHandler: Spezielle Fehlerbehandlung DTDHandler: Arbeiten mit Notationen und Entities EntityResolver: "Umbiegen" von URIs im Dokument Vorlesung "XML und Datenbanken" - WS 2003/2004 (Dr. C. Türker) 3-20 Beispiel: SAX-Anwendung (1) import java.io.FileReader; import org.xml.sax.XMLReader; import org.xml.sax.Attributes; import org.xml.sax.InputSource; import org.xml.sax.helpers.XMLReaderFactory; import org.xml.sax.helpers.DefaultHandler; public class MySAXApp extends DefaultHandler { public static void main (String args[]) throws Exception { XMLReader xr = XMLReaderFactory.createXMLReader(); MySAXApp handler = new MySAXApp(); xr.setContentHandler(handler); xr.setErrorHandler(handler); } // parse each file provided on the command line for (int i = 0; i < args.length; i++) { FileReader r = new FileReader(args[i]); xr.parse(new InputSource(r)); } public MySAXApp () { super(); } // overload event handlers (instead of explicitly registering them) public void startDocument () { System.out.println("Start document"); } public void endDocument () { System.out.println("End document"); } // go on with the next foil Vorlesung "XML und Datenbanken" - WS 2003/2004 (Dr. C. Türker) 3-21 Beispiel: SAX-Anwendung (2) public void startElement (String uri, String name, String qName, Attributes atts) { if ("".equals (uri)) System.out.println("Start element: " + qName); else System.out.println("Start element: {" + uri + "}" + name); } public void endElement (String uri, String name, String qName) { if ("".equals (uri)) System.out.println("End element: " + qName); else System.out.println("End element: {" + uri + "}" + name); } public void characters (char ch[], int start, int length) { System.out.print("Characters: \""); for (int i = start; i < start + length; i++) { switch (ch[i]) { case '\\': System.out.print("\\\\"); case '"': System.out.print("\\\""); case '\n': System.out.print("\\n"); case '\r': System.out.print("\\r"); case '\t': System.out.print("\\t"); default: System.out.print(ch[i]); } } System.out.print("\"\n"); } } // end of class MySAXApp Vorlesung "XML und Datenbanken" - WS 2003/2004 (Dr. C. Türker) break; break; break; break; break; break; 3-22 Beispiel: SAX-Anwendung (3) <?xml version="1.0"?> <poem xmlns="http://www.megginson.com/ns/exp/poetry"> <title>Roses are Red</title> <l>Roses are red,</l> Start document <l>Violets are blue;</l> Start element: {http://www.megginson.com/ns/exp/poetry}poem <l>Sugar is sweet,</l> Characters: "\n" <l>And I love you.</l> Start element: {http://www.megginson.com/ns/exp/poetry}title </poem> Characters: "Roses are Red" End element: {http://www.megginson.com/ns/exp/poetry}title Eingabedokument Characters: "\n" Start element: {http://www.megginson.com/ns/exp/poetry}l Characters: "Roses are red," End element: {http://www.megginson.com/ns/exp/poetry}l Characters: "\n" Start element: {http://www.megginson.com/ns/exp/poetry}l Characters: "Violets are blue;" End element: {http://www.megginson.com/ns/exp/poetry}l Characters: "\n" Start element: {http://www.megginson.com/ns/exp/poetry}l Characters: "Sugar is sweet," End element: {http://www.megginson.com/ns/exp/poetry}l Characters: "\n" Start element: {http://www.megginson.com/ns/exp/poetry}l Characters: "And I love you." End element: {http://www.megginson.com/ns/exp/poetry}l Ausgabe Characters: "\n" End element: {http://www.megginson.com/ns/exp/poetry}poem End document Vorlesung "XML und Datenbanken" - WS 2003/2004 (Dr. C. Türker) 3-23 Vergleich DOM versus SAX SAX DOM z einfacher Zugriff z Navigation durch Dokumentstruktur z einfach strukturierte oder gleichartig strukturierte Dokumente z dadurch kontextabhängige Zugriffe z Manipulation der Struktur auch geeignet für sehr große XMLDokumente z für sehr große XML-Dokumente problematisch Zugriff nur auf geringe Anteile eines Dokuments z auch Speicherungsstruktur z z z Beide Schnittstellen sind standardisiert und viele Implementierungen vorhanden: Portabilität, Plattformunabhängigkeit z Beide Ansätze erlauben KEINEN deklarativen, d.h., mengenorientierten Zugriff wie bei SQL auf die Daten in den XML-Dokumenten – z Programmieraufwand nötig (selbst für einfache Probleme) Wie lernen später Techniken kennen, die genau dieses Problem lösen! Vorlesung "XML und Datenbanken" - WS 2003/2004 (Dr. C. Türker) 3-24