Upload
didi-wenderoth
View
104
Download
0
Embed Size (px)
Citation preview
E-Business und E-Service
DOM-Bearbeitung von XML
Norbert Helminger26. November 2001
26.11.2001 Norbert Helminger 2
Gliederung
Einleitung: Was ist DOM? Erzeugen eines DOM-Objektes DOM-Baumstruktur Methoden
zum Lesen der Attribute zum Navigieren im Baum zum Verändern des Baumes
Kritikpunkte und Alternativen
26.11.2001 Norbert Helminger 3
Was ist das Document Object Model (DOM)?
standardisiertes Objektmodell für XML-Dokumente
Abstraktion des XML-Infosets auf ein Objektmodell
Satz von Schnittstellen, der ein XML-Dokument in einer Baumstruktur darstellt
standardisiertes API für die Verarbeitung von XML-Dokumenten (W3C-DOM-Arbeitsgruppe)
26.11.2001 Norbert Helminger 4
Was kann DOM?
definiert logische Struktur eines Dokuments
definiert die Möglichkeiten des Zugriffs und der Manipulation
managed die Daten eines XML-Dokuments abstrahiert die eckigen Klammern und die
Zeichenreferenzen des Serialisierungsformats
kann mit jeder Programmiersprache verwendet werden
26.11.2001 Norbert Helminger 5
Arbeitsweise von DOM
liest gesamtes XML-Dokument auf einmal ein (mit Hilfe eines Parsers)
teilt es in Objekte in einer Art Baumstruktur auf
behält gesamtes Dokument im Speicher
kann auf beliebige Objekte zugreifen
kann das Dokument beliebig verändern
26.11.2001 Norbert Helminger 6
Beispiel eines XML-Dokuments
<?xml version=„1.0“?>
<?order alpha ascending?>
<art xmlns=‚http://www.art.org/schemas/art‘>
<period name=„Renaissance“>
<artist>Leonardo da Vinci</artist>
<artist>Michelangelo</artist>
<artist>Donatello</artist>
</period>
<!-- insert period here -->
</art>
26.11.2001 Norbert Helminger 7
DOM-Struktur des Beispiels
Dokument
ProcessingInstruction
Element
Element
Element
ElementElement
KommentarAttr
Text
Text Text Text
Wurzelknoten
Wurzelelementknoten (Dokumentelement)
26.11.2001 Norbert Helminger 8
Gliederung
Einleitung: Was ist DOM? Erzeugen eines DOM-Objektes DOM-Baumstruktur Methoden
zum Lesen der Attribute zum Navigieren im Baum zum Verändern des Baumes
Kritikpunkte und Alternativen
26.11.2001 Norbert Helminger 9
Erzeugen eines DOM-Objektes
abstrakte Schnittstelle:kein new-Aufruf möglich
Implementierung der DOM-Schnittstelle muss ein Objekt einer DOMImplementation zur Verfügung stellen
Aufruf der Methoden createDocument bzw. createDocumentType
26.11.2001 Norbert Helminger 10
Erzeugen eines Dokuments
import org.w3c.dom.*;Document create() {
DOMImplementation impl = loadDOM();DocumentType dtd = impl.createDocumentType(
“foo:bar”, “-//FooBar//”, “foo.dtd”);return impl.createDocument(“http://foo.com/schema/”,
“foo:bar”, dtd);}
anschließend können dem Dokument Objekte hinzugefügt werden
26.11.2001 Norbert Helminger 11
Einlesen eines XML-Dokuments
mit Hilfe eines DOM-Parsers
ganzes XML-Dokument kann automatisch in ein DOM-Objekt umgewandelt werden
parser.parse(xmlfile);
Document doc = parser.getDocument();
26.11.2001 Norbert Helminger 12
Gliederung
Einleitung: Was ist DOM? Erzeugen eines DOM-Objektes DOM-Baumstruktur Methoden
zum Lesen der Attribute zum Navigieren im Baum zum Verändern des Baumes
Kritikpunkte und Alternativen
26.11.2001 Norbert Helminger 13
Baumstruktur von DOM
Basisknoten Node
alle Knoten sind von diesem abgeleitet
definiert grundlegende Funktionalität (Attribute, Methoden und Konstanten) aller Knotentypen
Nachteil: einige Operationen nicht auf jeden Knotentyp anwendbar
<<interface>>Node
+getNodeType()+getNodeName()+getNamespaceURI()+getPrefix()+getLocalName()+getNodeValue()+getParentNode()+getChildNodes()+getFirstChild()+getLastChild()+getPreviousSibling()+getNextSibling()+getAttributes()+getOwnerDocument()+insertBefore()+replaceChild()+removeChild()+appendChild()+hasChildNodes()+cloneNodes()+supports()
<<interface>>Document
+getDoctype()+getDocumentElement()+createElementNS()+createElement()+createDocumentFragment()+createComment()+createCDATASection()+createProcessingInstruction()+createAttributeNS()+createAttribute()+createEntityReference()+getElementByTagNameNS()+getElementsByTagName()+importNode()+getElementById()
<<interface>>Attr
+getSpecified()+getOwnerElement()+setValue()+getValue()+getName()
<<interface>>Element
+getAttributeNS()+getAttributeNodeNS()+setAttributeNS()+setAttributeNodeNS()+removeAttributeNS()+removeAttributeNodeNS()+hasAttributeNS()+getElementsByTagNameNS()+getTagName()
<<interface>>EntityReference
<<interface>>Entity
+getSystemId()+getPublicId()+getNotationName()
<<interface>>Notation
+getSystemId()+getPublicId()
<<interface>>Comment
<<interface>>Text
<<interface>>CDATASection
+splitText()
<<interface>>CharacterData
+getData()+getLength()+substringData()+setData()+appendData()+insertData()+deleteData()+replaceData()
<<interface>>NodeList
+item()+length()
<<interface>>DocumentFragment
+getSystemId()+getPublicId()
<<interface>>ProcessingInstruction
+getTarget()+getData()+setData()
<<interface>>DOMImplementation
+hasFeature()+createDocument()+createDocumentType()
<<interface>>DocumentType
+getName()+getEntities()+setNotations()+getPublicId()+getSystemId()+getInternalSubset()
<<interface>>NamedNodeMap
+getNamedItem()+getNamedItemNS()+setNamedItem()+setNamedItemNS()+removeNamedItem()+removeNamedItemNS()+item()
DOM-Schnittstellen
26.11.2001 Norbert Helminger 15
Knotentypen
Node Document Element CharacterDat
a Text CDATASection
Comment Attr Entity ProcessingInstr
uction DocumentType
26.11.2001 Norbert Helminger 16
Basisknoten (Node)
Attribute nodeType:
für jeden Knotentypen eine eigene Konstante (z.B. ELEMENT_NODE)
Kompatibilitätsprüfung nodeName, namespaceURI, localName, prefix:
zur Unterstützung der zugewiesenen Objektnamen
nodeValue: Wert des Knoten ownerDocument: Referenz auf das Dokument parentNode, firstChild ... benachbarte Knoten
Methoden zum Lesen, Navigieren und Verändern
26.11.2001 Norbert Helminger 17
Dokumentknoten (Document)
Wurzelknoten Fabrik für neue Knoten:
createElement(), createComment() ...
hat zwei Unterknoten: Wurzelelement des Dokuments Knoten des Dokumenttyps
26.11.2001 Norbert Helminger 18
Elementknoten (Element)
einzelne Tags des XML-Dokuments: Methoden zum Verändern der
Attribute Zugriff auf alle Unterelemente eines
Tagnamens:
getElementsByTagName(namespaceURI,
localname)
Beispiel: <artist>
26.11.2001 Norbert Helminger 19
CharacterData-Knoten
Basisschnittstelle für Text-, CDATASection- und Comment-Knoten
grundlegende Methoden zur Textbearbeitung
keine Ausprägung in einem XML-Dokument
26.11.2001 Norbert Helminger 20
Textknoten (Text)
häufigster CharacterData-Knoten repräsentiert den Zeicheninhalt
eines Elements bzw. Attributs darf kein Markup enthalten Methode normalize():
keine angrenzenden Textknoten
Beispiel: Leonardo da Vinci
26.11.2001 Norbert Helminger 21
Beispiel Text.normalize()
#document
Element
#text #text #text
hello wo rld
#document
Element
#text
hello world
normalize
26.11.2001 Norbert Helminger 22
CDATASection-/Comment-
Knoten
CDATASection: Unterschnittstelle von Text kann Markup enthalten
Comment: erweitert CharacterData repräsentiert Kommentare Beispiel: <!-- insert period here-->
26.11.2001 Norbert Helminger 23
Attributknoten (Attr)
beinhalten variable = value Paare eines Elements
existieren nur im Kontext des Tags ownerElement: zugehöriger
Elementknoten parent == null
Beispiel: name = „Renaissance“
26.11.2001 Norbert Helminger 24
Entitätsknoten (Entity)
Speichereinheiten, die Inhalte oder Inhaltsbeschreibungen enthalten
bei mehrmaligem Vorkommen können nur gelesen werden werden im DocumentType
gespeichert verkomplizieren Abarbeitung von
XML-Dokumenten
26.11.2001 Norbert Helminger 25
ProcessingInstruction-Knoten
am Beginn der XML-Datei zur Kontrolle von externen
Programmen zum Ordnen von Elementen
Beispiel: <?order alpha ascending?>
26.11.2001 Norbert Helminger 26
Dokumenttypknoten (DocumentType)
Platzhalter für die DTD
Liste von Entitäten und Notationen:NamedNodeMap
Attribut der Document-Schnittstelle
26.11.2001 Norbert Helminger 27
DOM-Struktur des Beispiels
#document
order
artist
period
art
artistartist
#commentname
#text
#text #text #text
Dokument
Element
Attr
Text
PI/Kommentar
alpha ascending
insert period here
Leonardo da Vinci Michelangelo Donatello
Renaissance
Knotentypen
26.11.2001 Norbert Helminger 28
Beziehungen zwischen Knoten
Attribute parentNode, firstChild ... definieren die Baumstruktur
parent/child-Attribute folgen lebendig jeder Änderung im Baum
dynamische Anpassung der Attribute Vorsicht bei Operationen am Baum
26.11.2001 Norbert Helminger 29
Eltern-Kinder-Beziehungen
artist
period
artistartist
date-range
#text
period period
name
#text
parentNode
previousSibling nextSibling
ownerDocument
children (geordnet)
firstChild lastChild
Attribute (ungeordnet)
#document
art
26.11.2001 Norbert Helminger 30
Gliederung
Einleitung: Was ist DOM? Erzeugen eines DOM-Objektes DOM-Baumstruktur Methoden
zum Lesen der Attribute zum Navigieren im Baum zum Verändern des Baumes
Kritikpunkte und Alternativen
26.11.2001 Norbert Helminger 31
Methoden zum Lesen der Attribute
getNodeType getNodeName getNamespaceURI getPrefix getLocalName getNodeValue getOwnerDocument getAttributes
26.11.2001 Norbert Helminger 32
Methoden zum Navigieren
getParentNode getChildNodes hasChildNodes getFirstChild getLastChild getPreviousSibling getNextSibling
26.11.2001 Norbert Helminger 33
Baum durchlaufen keine Methode zum Durchlaufen des
Baumesvoid traverseTree(Node current) {
myProcessNode(current);for (Node child = current.getFirstChild(); child != null;
child = child.getNextSibling() ) traverseTree(child);
}
Durchlaufen in die andere Richtungvoid traverseTreeReverse(Node current) {
for (Node child = current.getLastChild(); child != null;child = child.getPreviousSibling() )
traverseTreeReverse(child);myProcessNode(current);
}
26.11.2001 Norbert Helminger 34
Baum durchlaufen
period
#document
period
art
period period
artist artist artistartistartist artist
1
7
6
54
3
2
12
8
1110
9
1, 2, 3 ... Abarbeitungsreihenfolge der Knoten in der Methode traverseTree
26.11.2001 Norbert Helminger 35
Methoden zum Verändern
appendChild insertBefore replaceChild removeChild cloneNode
26.11.2001 Norbert Helminger 36
Einfügen von neuen Knoten
appendChild(Node newChild)fügt am Ende der Liste der Tochterknoten einen neuen Knoten ein
insertBefore(Node newChild, Node refChild)fügt einen neuen Knoten vor dem Referenzknoten ein
bei erneutem Einfügen eines bereits vorhan-denen Knotens wird dieser nur verschoben
26.11.2001 Norbert Helminger 37
Beispiel Einfügen
import org.w3c.dom.*;
void addTwoPeriods(Document doc, Node art) {
Node newChild1 = doc.createElementNS(
“http://www.art.org/schemas/art”, “period”);
art.appendChild(newChild1);
Node newChild2 = doc.createElementNS(
“http://www.art.org/schemas/art”, “period”);
Node pos = art.getFirstChild().getNextSibling();
Node insertedNode = art.insertBefore(newChild2, pos);
assert(newChild2 == insertedNode);
assert(insertedNode == art.getChildNodes().item(1));
}
26.11.2001 Norbert Helminger 38
Beispiel Einfügen
#document
period
art
period
child1 child2
period
newChild1(insertBefore)
period
#document
period
art
child1 child2
period
newChild2(appendChild)
26.11.2001 Norbert Helminger 39
Ersetzen bzw. Löschen von Knoten
replaceChild(Node newChild, Node oldChild)kombiniert Einfügen und Löschen eines Knotens
removeChild(Node oldChild)entfernt einen Knoten aus dem Dokument
26.11.2001 Norbert Helminger 40
Beispiel Ersetzen/Löschen
import org.w3c.dom.*;
void removeAndReplace(Document doc, Node art) {
Node newChild = doc.createElementNS(
“http://www.art.org/schemas/art”, “period”);
art.replaceChild(newChild, art.getFirstChild());
art.removeChild(art.getLastChild());
}
26.11.2001 Norbert Helminger 41
Beispiel Ersetzen/Löschen
#document
period
art
period
child1 child2
#document
period
art
period
newChild child2
#document
art
period
newChild
replaceChild removeChild
26.11.2001 Norbert Helminger 42
Duplizieren von Knoten
cloneNode(boolean deep) liefert eine exakte Kopie des Knotens
deep-Parameter true: Kopie inklusive Tochterknoten
import org.w3c.dom.*;
void cloneLastPeriod(Node art) {
Node clone = art.getLastChild().cloneNode(true);
art.appendChild(clone);
}
26.11.2001 Norbert Helminger 43
Beispiel Duplizieren
#document
artist
period
artist artist
period
artist
art
cloneNode
appendChild
26.11.2001 Norbert Helminger 44
Gliederung
Einleitung: Was ist DOM? Erzeugen eines DOM-Objektes DOM-Baumstruktur Methoden
zum Lesen der Attribute zum Navigieren im Baum zum Verändern des Baumes
Kritikpunkte und Alternativen
26.11.2001 Norbert Helminger 45
Kritikpunkte an DOM
gesamtes Dokument im Speicher
keine Ein- bzw. Ausgabeoperationen
gibt auch Objekte, die zwar das Interface implementieren, sonst aber wenig machen
Probleme mit der Performance bei größeren Dokumenten
26.11.2001 Norbert Helminger 46
Alternative SAX
Simple API for XML
Menge von Streaming-Schnittstellen, die ein XML-Dokument in eine lineare Sequenz bekannter Methodenaufrufe zerlegen
XML-Dokument nur einmal durchlaufen
XML-Dokument dem gewünschten Output sehr ähnlich
26.11.2001 Norbert Helminger 47
Wann soll DOM verwendet werden?
XML-Dokument in einer Baumstruktur anzeigen
Elemente dem Dokument hinzugefügt
ausreichend Hauptspeicher
Verarbeitungsgeschwindigkeit ist nicht so wichtig
26.11.2001 Norbert Helminger 48
Zusammenfassung
Aufbau einer DOM-Baumstruktur Methoden zum Lesen der Attribute Methoden zum Navigieren im Baum Methoden zum Verändern des
Baums Performance-Probleme
26.11.2001 Norbert Helminger 49
Literaturangaben
Don Box, Aaron Skonnard, John Lam: Essential XML - XML für die Softwareentwicklung, Addison-Wesley, 2001.
Elke Niedermair, Michael Niedermair: Das große Buch XML, Data Becker, Düsseldorf, 2001.
Mark Johnson: Programming XML in Java, Part 3 - DOMination, July 2000, http://www.javaworld.com/jw-07-2000/jw-0707-xmldom.html.
Philippe Le Hégaret: What is the Document Object Model? September 2001, www.w3.org/DOM/.