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