490 likes | 553 Views
E-Business und E-Service. DOM-Bearbeitung von XML Norbert Helminger 26. November 2001. 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.
E N D
E-Business und E-Service DOM-Bearbeitung von XML Norbert Helminger 26. November 2001
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 Norbert Helminger
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) Norbert Helminger
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 Norbert Helminger
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 Norbert Helminger
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> Norbert Helminger
DOM-Struktur des Beispiels Wurzelknoten Dokument Wurzelelementknoten (Dokumentelement) ProcessingInstruction Element Element Kommentar Attr Element Element Element Text Text Text Text Norbert Helminger
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 Norbert Helminger
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 Norbert Helminger
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 Norbert Helminger
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(); Norbert Helminger
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 Norbert Helminger
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 Norbert Helminger
DOM-Schnittstellen <<interface>> EntityReference <<interface>> Element <<interface>> Attr <<interface>> Document <<interface>> Node +getAttributeNS() +getAttributeNodeNS() +setAttributeNS() +setAttributeNodeNS() +removeAttributeNS() +removeAttributeNodeNS() +hasAttributeNS() +getElementsByTagNameNS() +getTagName() +getSpecified() +getOwnerElement() +setValue() +getValue() +getName() +getDoctype() +getDocumentElement() +createElementNS() +createElement() +createDocumentFragment() +createComment() +createCDATASection() +createProcessingInstruction() +createAttributeNS() +createAttribute() +createEntityReference() +getElementByTagNameNS() +getElementsByTagName() +importNode() +getElementById() +getNodeType() +getNodeName() +getNamespaceURI() +getPrefix() +getLocalName() +getNodeValue() +getParentNode() +getChildNodes() +getFirstChild() +getLastChild() +getPreviousSibling() +getNextSibling() +getAttributes() +getOwnerDocument() +insertBefore() +replaceChild() +removeChild() +appendChild() +hasChildNodes() +cloneNodes() +supports() <<interface>> Entity +getSystemId() +getPublicId() +getNotationName() <<interface>> Notation +getSystemId() +getPublicId() <<interface>> ProcessingInstruction <<interface>> DOMImplementation +getTarget() +getData() +setData() <<interface>> DocumentFragment <<interface>> CDATASection +hasFeature() +createDocument() +createDocumentType() +getSystemId() +getPublicId() <<interface>> CharacterData <<interface>> NamedNodeMap <<interface>> NodeList <<interface>> Text +getData() +getLength() +substringData() +setData() +appendData() +insertData() +deleteData() +replaceData() <<interface>> DocumentType +getNamedItem() +getNamedItemNS() +setNamedItem() +setNamedItemNS() +removeNamedItem() +removeNamedItemNS() +item() +item() +length() +splitText() <<interface>> Comment +getName() +getEntities() +setNotations() +getPublicId() +getSystemId() +getInternalSubset()
Node Document Element CharacterData Text CDATASection Comment Attr Entity ProcessingInstruction DocumentType Knotentypen Norbert Helminger
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 Norbert Helminger
Dokumentknoten (Document) • Wurzelknoten • Fabrik für neue Knoten:createElement(), createComment() ... • hat zwei Unterknoten: • Wurzelelement des Dokuments • Knoten des Dokumenttyps Norbert Helminger
Elementknoten (Element) • einzelne Tags des XML-Dokuments: • Methoden zum Verändern der Attribute • Zugriff auf alle Unterelemente eines Tagnamens: getElementsByTagName(namespaceURI, localname) • Beispiel: <artist> Norbert Helminger
CharacterData-Knoten • Basisschnittstelle für Text-, CDATASection- und Comment-Knoten • grundlegende Methoden zur Textbearbeitung • keine Ausprägung in einem XML-Dokument Norbert Helminger
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 Norbert Helminger
#document normalize Element #text hello world Beispiel Text.normalize() #document Element #text #text #text hello wo rld Norbert Helminger
CDATASection-/Comment- Knoten • CDATASection: • Unterschnittstelle von Text • kann Markup enthalten • Comment: • erweitert CharacterData • repräsentiert Kommentare • Beispiel: <!-- insert period here--> Norbert Helminger
Attributknoten (Attr) • beinhalten variable = value Paare eines Elements • existieren nur im Kontext des Tags • ownerElement: zugehöriger Elementknoten • parent == null • Beispiel: name = „Renaissance“ Norbert Helminger
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 Norbert Helminger
ProcessingInstruction-Knoten • am Beginn der XML-Datei • zur Kontrolle von externen Programmen • zum Ordnen von Elementen • Beispiel: <?order alpha ascending?> Norbert Helminger
Dokumenttypknoten (DocumentType) • Platzhalter für die DTD • Liste von Entitäten und Notationen: NamedNodeMap • Attribut der Document-Schnittstelle Norbert Helminger
DOM-Struktur des Beispiels #document Knotentypen Dokument art order Element alpha ascending period #comment name Attr insert period here artist artist artist #text Text Renaissance #text #text #text PI/Kommentar Leonardo da Vinci Michelangelo Donatello Norbert Helminger
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 Norbert Helminger
Eltern-Kinder-Beziehungen #document ownerDocument parentNode art Attribute (ungeordnet) period period period date-range name previousSibling nextSibling #text #text artist artist artist children (geordnet) firstChild lastChild Norbert Helminger
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 Norbert Helminger
Methoden zum Lesen der Attribute • getNodeType • getNodeName • getNamespaceURI • getPrefix • getLocalName • getNodeValue • getOwnerDocument • getAttributes Norbert Helminger
Methoden zum Navigieren • getParentNode • getChildNodes • hasChildNodes • getFirstChild • getLastChild • getPreviousSibling • getNextSibling Norbert Helminger
Baum durchlaufen • keine Methode zum Durchlaufen des Baumes void traverseTree(Node current) { myProcessNode(current); for (Node child = current.getFirstChild(); child != null; child = child.getNextSibling() ) traverseTree(child); } • Durchlaufen in die andere Richtung void traverseTreeReverse(Node current) { for (Node child = current.getLastChild(); child != null; child = child.getPreviousSibling() ) traverseTreeReverse(child); myProcessNode(current); } Norbert Helminger
Baum durchlaufen 1 #document 2 art 3 6 8 9 period period period period 7 artist artist artist artist artist artist 4 5 10 11 12 1, 2, 3 ... Abarbeitungsreihenfolge der Knoten in der Methode traverseTree Norbert Helminger
Methoden zum Verändern • appendChild • insertBefore • replaceChild • removeChild • cloneNode Norbert Helminger
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 Norbert Helminger
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)); } Norbert Helminger
#document art period period period period child1 newChild1 (insertBefore) child2 newChild2 (appendChild) Beispiel Einfügen #document art period period child1 child2 Norbert Helminger
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 Norbert Helminger
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()); } Norbert Helminger
#document #document art art replaceChild removeChild period period period newChild child2 newChild Beispiel Ersetzen/Löschen #document art period period child1 child2 Norbert Helminger
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); } Norbert Helminger
appendChild period cloneNode artist artist Beispiel Duplizieren #document art period artist artist Norbert Helminger
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 Norbert Helminger
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 Norbert Helminger
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 Norbert Helminger
Wann soll DOM verwendet werden? • XML-Dokument in einer Baumstruktur anzeigen • Elemente dem Dokument hinzugefügt • ausreichend Hauptspeicher • Verarbeitungsgeschwindigkeit ist nicht so wichtig Norbert Helminger
Zusammenfassung • Aufbau einer DOM-Baumstruktur • Methoden zum Lesen der Attribute • Methoden zum Navigieren im Baum • Methoden zum Verändern des Baums • Performance-Probleme Norbert Helminger
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/. Norbert Helminger