XML-Parser K. Schild, 2006 / M. Mochol 2007 1



Ähnliche Dokumente
XML-Parser. Parser. Heutige Vorlesung. Grundlegende Architektur. Kategorien von Parser

Klaus Schild, XML Clearinghouse Verarbeitung von XML- Dokumenten

XML-Parser. Markus Luczak-Rösch Freie Universität Berlin Institut für Informatik Netzbasierte Informationssysteme

Verarbeitung von XML- Dokumenten

XML-Parser. Markus Luczak-Rösch Freie Universität Berlin Institut für Informatik Netzbasierte Informationssysteme

, Rainer Schmidberger, ISTE. XML und Java. Rainer Schmidberger

Programmieren II SAX. Beispiel-Schema kontakt.xsd SAX DOM. Dr. Klaus Höppner JAXB. Hochschule Darmstadt SS 2008

Ruhr.pm XML-Daten verarbeiten mit XML::LibXML Autor: Datum:

XML-Frameworks in verschiedenen Programmiersprachen Proseminar Textkodierung und Auszeichnung

XML-Programmierschnittstellen: SAX, DOM

Java und XML 2. Java und XML

Java: Kapitel 9. Java und XML. Programmentwicklung WS 2008/2009. Holger Röder

XML. extensible Markup Language. Dr. Beatrice Amrhein.

Seminar: XML und Datenbanken

Programmieren II. Einführung in XML. Vorlesung 13. Handout S. 1. Dr. Klaus Höppner. Hochschule Darmstadt Sommersemester 2010 XML JAXP SAX DOM

JAVA/XML Das bhv Taschenbuch

Gruppe A PRÜFUNG AUS SEMISTRUKTURIERTE DATEN Kennnr. Matrikelnr. Familienname Vorname

Verarbeitung von XML mit SAX und DOM

XML-Technologien. XML-Parser. Florian Raith Hochschule München Fakultät für Informatik und Mathematik am 04. November 2010

1 Software Engineering 1

2. XML 2.1 XML 1.0 und XML Schema. Jörg Schwenk Lehrstuhl für Netz- und Datensicherheit

5. Programmierschnittstellen für XML

Übungen zur Softwaretechnik

Objektorientierte Programmierung

SEMINAR Modifikation für die Nutzung des Community Builders

Der Aufruf von DM_in_Euro 1.40 sollte die Ausgabe 1.40 DM = Euro ergeben.

Folge 19 - Bäume Binärbäume - Allgemeines. Grundlagen: Ulrich Helmich: Informatik 2 mit BlueJ - Ein Kurs für die Stufe 12

5. Programmierschnittstellen für XML

Software Engineering Klassendiagramme Assoziationen

SAX Simple API for XML

... MathML XHTML RDF

Programmieren II. Annotationen (1/3) Vorlesung 6. Handout S. 1. Martin Schultheiß. Hochschule Darmstadt Sommersemester Annotationen XML JAXB

Programmieren II. Annotationen (1/3) Vorlesung 6. Handout S. 1. Martin Schultheiß. Hochschule Darmstadt Sommersemester Annotationen XML JAXB

Fassade. Objektbasiertes Strukturmuster. C. Restorff & M. Rohlfing

2.4 Analyse von XML-Dokumenten

Updatehinweise für die Version forma 5.5.5

1. Einführung. Gliederung. Document Object Model (DOM) DOM Die Spezifikation (1) Level 2 HTML Specification. 1. Einführung. 2.

Institut für Programmierung und Reaktive Systeme 25. August Programmier-Labor Übungsblatt. int binarysearch(int[] a, int x),

Präsentation zum Thema XML Datenaustausch und Integration

Online-Publishing mit HTML und CSS für Einsteigerinnen

Grundlagen von Python

Programmierkurs Java

Objektorientierte Programmierung

Die Beschreibung bezieht sich auf die Version Dreamweaver 4.0. In der Version MX ist die Sitedefinition leicht geändert worden.

Java und XML. Praktikum aus Softwareentwicklung 2. Java Praktikum SS 2010

Suchbäume. Annabelle Klarl. Einführung in die Informatik Programmierung und Softwareentwicklung

SEP 114. Design by Contract

Software Engineering. Zur Architektur der Applikation Data Repository. Franz-Josef Elmer, Universität Basel, HS 2015

Klaus Schild, XML Clearinghouse Namensräume

Große Übung Praktische Informatik 1

WEBSEITEN ENTWICKELN MIT ASP.NET

Fachgebiet Informationssysteme Prof. Dr.-Ing. N. Fuhr. Programmierung Prof. Dr.-Ing. Nobert Fuhr. Übungsblatt Nr. 6

Übungen Programmieren 1 Felix Rohrer. Übungen

Session Beans & Servlet Integration. Ralf Gitzel ralf_gitzel@hotmail.de

KURZANLEITUNG CLOUD OBJECT STORAGE

Klaus Schild, XML Clearinghouse Transformation von XML-Dokumenten

Übung: Verwendung von Java-Threads

Applet Firewall und Freigabe der Objekte

Vortrag im Rahmen des IFC-Seminars am Performance Messungen mit XML bei der empolis GmbH

Daniel Warneke Ein Vortrag im Rahmen des Proseminars Software Pioneers

CARL HANSER VERLAG. Dirk Ammelburger XML. Grundlagen der Sprache und Anwendungen in der Praxis

SJ OFFICE - Update 3.0

Objektorientierte Programmierung für Anfänger am Beispiel PHP

5.2 Neue Projekte erstellen

Java Kurs für Anfänger Einheit 5 Methoden

Binäre Bäume. 1. Allgemeines. 2. Funktionsweise. 2.1 Eintragen

Java: Vererbung. Teil 3: super()

OP-LOG

Acceptor-Connector. Acceptor-Connector

Java Einführung Collections

Leichte-Sprache-Bilder

Sich einen eigenen Blog anzulegen, ist gar nicht so schwer. Es gibt verschiedene Anbieter. ist einer davon.

Eine Anwendung mit InstantRails 1.7

Wichtige Hinweise zu den neuen Orientierungshilfen der Architekten-/Objektplanerverträge

XML Schema vs. Relax NG

HTML5. Wie funktioniert HTML5? Tags: Attribute:

Es sollte die MS-DOS Eingabeaufforderung starten. Geben Sie nun den Befehl javac ein.

Klassenentwurf. Wie schreiben wir Klassen, die leicht zu verstehen, wartbar und wiederverwendbar sind? Objektorientierte Programmierung mit Java

AGROPLUS Buchhaltung. Daten-Server und Sicherheitskopie. Version vom b

XML Tutorium mit Oxygen. Oxygen Version 9.3!!

Lineargleichungssysteme: Additions-/ Subtraktionsverfahren

XSL Templates. Mit Templates arbeiten. XSL Templates

Institut für Programmierung und Reaktive Systeme 26. April Programmieren II. 10. Übungsblatt

Verhindert, dass eine Methode überschrieben wird. public final int holekontostand() {...} public final class Girokonto extends Konto {...

Gruppe A PRÜFUNG AUS SEMISTRUKTURIERTE DATEN Kennnr. Matrikelnr. Familienname Vorname

Folgende Einstellungen sind notwendig, damit die Kommunikation zwischen Server und Client funktioniert:

Übung Grundlagen der Programmierung. Übung 03: Schleifen. Testplan Testergebnisse

Einführung in die Java- Programmierung

Dirk Ammelburger XML. Grundlagen der Sprache und Anwendungen in der Praxis HANSER

Vorkurs C++ Programmierung

Übungen zu Einführung in die Informatik: Programmierung und Software-Entwicklung: Lösungsvorschlag

Formular»Fragenkatalog BIM-Server«

Log xmllog textlog Log() start(filename) add(message) end() instance() Abbildung 7-10: Die Protokollierungs-API mit einer einfachen Fassade

Diese Ansicht erhalten Sie nach der erfolgreichen Anmeldung bei Wordpress.

Bauteilattribute als Sachdaten anzeigen

dpa-infocom - Datenlieferung

Programmieren I. Strategie zum Entwurf von Klassen. Beispiele. Design von Klassen. Dr. Klaus Höppner. Beispiel: Bibliothek

Ferhat Ayaz. XML mit C++

Fachdidaktik der Informatik Jörg Depner, Kathrin Gaißer

Transkript:

XML-Parser 1

Heutige Vorlesung letzte Woche XML-Schema - Datentypen - Element- und Attribut-Deklarationen - Typsubstitution heutige Vorlesung Welche XML-Parser gibt es? Was sind ihre Vor- und Nachteile? Schema-Übersetzer als Alternative 2

Grundlegende Architektur Zeichenkette XML- Dokument Serialisierer Parser standardisierte APIs Anwendung Parser analysiert XML-Dokument und erstellt evtl. Parse-Baum mit Tags, Text-Inhalten und Attribut-Wert-Paaren als Knoten Serialisierer Datenstruktur XML-Dokument 3

Kategorien von Parser Validierender vs. nicht-validierender Parser Wird die Validität des Dokumentes untersucht? Pull- vs. Push-Parser Parser Wer hat Kontrolle über das Parsen: die Anwendung oder der Parser? Einschritt- vs. Mehrschritt-Parser Wird das XML-Dokument in einem Schritt vollständig geparst oder Schritt für Schritt? Beachte: Kategorien unabhängig voneinander, können kombiniert werden 4

Validierender vs. nicht-validierender Validierender Parser Ist das XML-Dokument valide? DTD oder XML-Schema erforderlich Ist das XML-Dokument wohlgeformt? Nicht-validierender Parser Ist das XML-Dokument wohlgeformt? 5

Pull-Parser Parser Pull-Parser nächste Einheit? geparste Einheit nächste Einheit? geparste Einheit Anwendung Anwendung hat Kontrolle über das Parsen. Analyse der nächsten syntaktischen Einheit muss aktiv angefordert werden. Beachte: Pull aus Perspektive der Anwendung. 6

Push-Parser Parser Push-Parser alles Parsen! geparste Einheit geparste Einheit geparste Einheit Anwendung Parser hat Kontrolle über das Parsen. Sobald der Parser eine syntaktische Einheit analysiert hat, übergibt er die entsprechende Analyse. Beachte: Push aus Perspektive der Anwendung. 7

XML-Parser One step Multi step Pull DOM JAXP Push SAX JAXP: Java API for XML Processing JAXP in J2SE 5.0 & Java WSDP 2.0 enthalten DOM: Document Object Model SAX: Simple API for XML 8

SAX-Parser 9

SAX: Simple API for XML Mehrschritt-Push Push-Parser Parser für f r XML kein W3C-Standard, sondern de facto Standard standardisiertes API ursprünglich nur Java-API inzwischen werden aber auch viele andere Sprachen unterstützt: C, C++, VB, Pascal, Perl http://www.saxproject.org/ auch in MSXML integriert 10

Ereignisbasiertes Parsen SAX-Parser einmaliges Anstoßen des Parsers Ereignis: neue syntaktische Einheit geparst Event Handler Anwendung 11

Beispiel <pricelist> <coffee> <name> Mocha Java </name> <price> 11.95 </price> </coffee> </pricelist> Parser ruft startelement(,pricelist, ) auf. Parser ruft startelement(,coffee, ) auf. Parser ruft startelement(,name, ) auf. Parser ruft characters("mocha Java", ) auf. Parser ruft endelement(,name,..) auf. Parser ruft startelement(,price, ) auf. Parser ruft characters("11.95", ) auf. Parser ruft endelement(,price, ) auf. Parser ruft endelement(,coffee, ) auf. Parser ruft endelement(,pricelist, ) auf. Ereignisfluss: Sobald Einheit geparst wurde, wird Anwendung benachrichtigt. Beachte: Es wird kein Parse-Baum aufgebaut! 12

Callback-Methoden Methoden des Event-Handlers (also der Anwendung), die vom Parser aufgerufen werden für jede syntaktische Einheit eigene Callback-Methode, u.a.: - startdocument und enddocument - startelement und endelement - characters - processinginstruction DefaultHandler Standard-Implementierung der Callback-Methoden: tun jeweils nichts! können natürlich überschrieben werden 13

Interface ContentHandler startdocument einmalig zu Beginn des Parsens enddocument einmalig am Ende des Parsens aufgerufen startprefixmapping wenn eine Präfixbindung für einen Namensraum beginnt endprefixmapping wenn eine Präfixbindung für einen Namensraum endet startelement wenn ein Starttag geparst wurde endelement wenn ein Endtag geparst wurde characters wenn beim Parsen des Elementinhalts Zeichendaten (#PCDATA) angetroffen werden 14

Callback-Methode startelement public void startelement(java.lang.string uri, java.lang.string localname, java.lang.string qname, Attributes attributes) throws SAXException uri: Namensraum-Bezeichner oder leerer String localname: lokaler Name ohne Präfix oder leerer String qname: Name mit Präfix oder leerer String attributes: zu dem Element gehörige Attribute Attribute können über ihre Position (Index) oder ihren Namen zugegriffen werden endelement ähnlich, jedoch ohne attributes 15

Callback-Methode characters public void characters(char[] buffer, int offset, int length) throws SAXException buffer: Liste von Zeichen offset: Anfangsindex offset+length String s = new String(buffer, offset, length); 16

Beispiel <pricelist> <coffee> <name> Mocha Java </name name> <price> 11.95 </price price> </coffee> </pricelist> Aufgabe: Gib den Preis von Mocha Java aus! Hierfür benötigen wir zwei Dinge: 1. einen SAX-Parser 2. passende Callback- Methoden 17

Wie bekomme ich einen SAX-Parser Parser? SAXParserFactory factory = SAXParserFactory.newInstance(); liefert eine SAXParserFactory SAXParser saxparser = factory.newsaxparser(); liefert einen SAXParser saxparser.parse("pricelist.xml", handler); stößt SAX-Parser an pricelist.xml: zu parsende Datei, kann auch URL oder Stream sein handler: Instanz von DefaultHandler, implementiert Callback-Funktionen 18

Exkurs: Factory Method Entwurfsmuster aus Design Patterns von Gamma, Helm, Johnson, Vlissides (1995) liefert ein Objekt Objekt ist Instanz einer abstrakten Klasse oder einem Interface. abstrakte Klasse / Interface von mehreren Klassen implementiert Beispiel: Iterator i = list.iterator(); Beispiel: SAXParser saxparser = factory.newsaxparser(); 19

Logik der Callback-Methoden <pricelist> <coffee> <name> Mocha Java </name> <price> 11.95 </price> </coffee> </pricelist> Zustände als boolesche Variablen Start inname inmochajava inmjprice print(s) startelement = "name"? characters = "Mocha Java"? startelement = "price"? characters = "s"? 20

Die Callback-Methoden in Java public void startelement(..., String elementname,,...) { if (elementname.equals("name")){ inname = true; } else if (elementname.equals("price") && inmochajava ){ inmjprice = true; inmochajava = false; } } public void characters(char [] buf, int offset, int len) { String s = new String(buf, offset, len); if (inname && s.equals("mocha Java")) { inmochajava = true; inname = false; } else if (inmjprice) { System.out.println("The price of Mocha Java is: " + s); inmjprice = false; } } alle anderen Callback-Methoden aus DefaultHandler = tun nichts 21

Start: Auf <name> warten public void startelement(..., String elementname,...){ if (elementname.equals("name")){")){ inname = true; } else if (elementname.equals("price") && inmochajava ){ inmjprice = true; <name> name>mocha Java</name> inmochajava = false; } } <price>11.95</price> public void characters(char [] buf, int offset, int len) { String s = new String(buf, offset, len); if (inname && s.equals("mocha Java")) { inmochajava = true; inname = false; } Start else if (inmjprice) { System.out.println("The Anfangszustand price of Mocha Java is: " + s); inmjprice = false; } } keine eigene Zustandsvariable alle Zustandsvariablen = false Start inname 22

inname: Auf "Mocha Java" warten public void startelement(..., String elementname,...){ if (elementname.equals("name")){ inname = true; } else if (elementname.equals("price") && inmochajava ){ inmjprice = true; inmochajava = false; } } <name>mocha Java</name> <price>11.95</price> public void characters(char [] buf, int offset, int len) { String s = new String(buf, offset, len); if (inname && s.equals("mocha Java")) { inmochajava = true; inname = false; } else if (inmjprice) { System.out.println("The price of Mocha Java is: " + s); inmjprice = false; } } Start inname inmochajava 23

Eine bessere Alternative public void characters(char [] buf, int offset, int len) { String s = new String(buf, offset, len); if (inname)) { if (s.equals("mocha Java")) { inmochajava = true; inname = false; } else inname = false; ; } else if (inmjprice) { System.out.println("The price of Mocha Java is: " + s); inmjprice = false; } } <name>mocha Java</name> <price>11.95</price> Start inname inmochajava 24

inmochajava: Auf <price> warten public void startelement(..., String elementname,...){ if (elementname.equals("name")){ inname = true; } else if (elementname.equals("price")") && inmochajava ){ inmjprice = true; <name>mocha Java</name> inmochajava = false; } } <price>11.95</price> public void characters(char [] buf, int offset, int len) { String s = new String(buf, offset, len); if (inname && s.equals("mocha Java")) { inmochajava = true; inname = false; } else if (inmjprice) { System.out.println("The price of Mocha Java is: " + s); inmjprice = false; } } inname inmochajava inmjprice 25

inmjprice: Preis ausgeben public void startelement(..., String elementname,...){ if (elementname.equals("name")){ inname = true; } else if (elementname.equals("price") && inmochajava ){ inmjprice = true; inmochajava = false; } } <name>mocha Java</name> <price>11.95</price> public void characters(char [] buf, int offset, int len) { String s = new String(buf, offset, len); Start if (inname && s.equals("mocha Java")) { inmochajava = true; inname = false; } inmjprice else if (inmjprice)) { System.out.println("The price of Mocha Java is: : " + s); inmjprice = false; } } print(s) 26

Fehlerbehandlung <pricelist> <coffee> <name> Mocha Java </name> <name> MS Java </name> <price> 11.95 </price> </coffee> </pricelist> Start inname inmochajava inmjprice print(s) startelement = "name"? characters = "Mocha Java"? startelement = "price"? characters = "s"? 27

Fehlerbehandlung public void startelement(..., String elementname,...){ if (elementname.equals("name")){ inname = true; } else if (elementname.equals("price")") && inmochajava ){ inmjprice = true; <name>mocha Java</name> inmochajava = false; } } <name>ms Java</name> <price>11.95</price> inmochajava erwartet <price> kommt stattdessen <name>, wird aktueller Zustand inmochajava nicht verändert kommt danach <price>, wird aktueller Zustand inmjprice Preis von MS Java wird ausgegeben! inname inmochajava inmjprice 28

Fehlerbehandlung SAX-Parser überprüft immer Wohlgeformtheit eines XML-Dokumentes. kann aber auch die Zulässigkeit bzgl. einer DTD oder eines Schema überprüfen Schema kann z.b. (name price) + verlangenf Syntax- und Strukturfehler kann bereits der SAX-Parser abfangen Callback-Methoden können dann von wohlgeformten und zulässigen Dokument ausgehen. 29

Vor- und Nachteile von SAX + sehr effizient, auch bei großen XML-Dokumenten Kontext (Parse-Baum) muss von Anwendung selbst verwaltet werden. abstrahiert nicht von XML-Syntax nur Parsen möglich, keine Modifikation oder Erstellung von XML-Dokumenten 30

Zusätzliche Schicht zum Datenzugriff Anwendung SAX SAX startelement characters Datenzugriff Datenzugriff getpricelist() Anwendungslogik Anwendungslogik durch zusätzliche Schicht vom Datenzugriff trennen (nicht nur bei SAX). Z.B. könnte getpricelist() eine Liste von Ware-Preis- Paaren liefern. sollte nicht nur von SAX-APIs, sondern auch von XML- Syntax abstrahieren 31

DOM-Parser 32

Document Object Model (DOM) XML- Parser DOM Anwendung streng genommen kein Parser, sondern abstrakte Schnittstelle zum Zugreifen, Modifizieren und Erstellen von Parse-Bäumen W3C-Standard unabhängig von Programmiersprachen nicht nur für XML-, sondern auch für HTML- Dokumente im Ergebnis aber Einschritt-Pull Pull-ParserParser 33

DOM-Module Module Level 1: DOM-Kern (DOM Core) + Spezialisierungen für HTML und XML; Bearbeitung von Dokumentinhalten & Navigation innerhalb der Dokumente http://www.w3.org/tr/1998/rec-dom-level-1-19981001/ Level 2: Namensräumen + CSS Änderungen der Baumstruktur eines Dokuments unterschiedliche Views von Dokumenten Level 3 (W3C Working Draft): Anpassungen an XML Infoset, XML Base und XPath, 34

DOM-Parse Parse-Bäume <?xml version="1.0"?> <pricelist> <coffee> <name>mocha Java</name> <price>11.95</price> </coffee> </pricelist> Document Node NodeList Element Node: PriceList NodeList Element Node: coffee Beachte: Dokument-Wurzel (Document Node) pricelist Document Node: virtuelle Dokument-Wurzel, um z.b. version="1.0" zu repräsentieren Document Node und Element Node immer NodeList List als Kind 35

Rest des Parse-Baumes <?xml version="1.0"?> <pricelist> <coffee> <name>mocha Java</name> <price>11.95</price> </coffee> </pricelist> Beachte: PCDATA wird als eigener Knoten dargestellt. Element Node: coffee NodeList Element Node: name NodeList Text Node: Mocha Java Element Node: price NodeList Text Node: 11.95 36

Navigationsmodell parentnode previoussibling Node nextsibling childnodes firstchild lastchild direkter Zugriff über Namen möglich: getelementsbytagname 37

Beispiel <pricelist> <coffee> <name> Mocha Java </name name> <price> 11.95 </price price> </coffee> </pricelist> Aufgabe: Gib den Preis von Mocha Java aus! Hierfür benötigen wir zwei Dinge: 1. einen DOM-Parser 2. eine passende Zugriffsmethode 38

Wie bekomme ich einen DOM-Parser Parser? DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); liefert DocumentBuilderFactory DocumentBuilder builder = factory.newdocumentbuilder(); liefert DOM-Parser Document document = builder.parse("pricelist.xml"); DOM-Parser hat Methode parse(). liefert in einem Schritt kompletten DOM-Parse-Baum 39

Wie sehen die Zugriffsmethoden aus? NodeList coffeenodes = document.getelementsbytagname("coffee"); "); for (int i=0; i < coffeenodes.getlength(); i++) { thiscoffeenode = coffeenodes.item(i); Node thisnamenode = thiscoffeenode.getfirstchild(); String data = thisnamenode.getfirstchild().getnodevalue(); (); if (data.equals("mocha Java")) { Node thispricenode = thisnamenode.getnextsibling(); String price = thispricenode.getfirstchild().getnodevalue(); (); break; } } = Java-Programm, das DOM- Methoden benutzt 40

Interface Hierarchie interface org.w3c.dom. DOMImplementation NamedNodeMap Node Atr CharacterData Document DocumentFragment DocumentType Element Comment Text NodeList Entity EntityReference Notation PrrocessingInstruction 41

org.w3c.dom.nodelist Kinder eines bestimmten Knotens (Kollektion) int getlength() Anzahl der Knoten in der Liste Node item(int index) item mit dem vorgegebenen Index 42

org.w3c.dom.node Node appendchild(node newchild) Hängt einen neuen Kindknoten an die bereits existierenden an NodeList getchildnodes() Liste mit allen Kindknoten Node getfirstchild() Node getlastchild() Liefert eine Referenz auf den ersten/letzen Kinderknoten zurück Node getnextsibling() Node getprevioussibling() Referenz auf den nachfolgenden/ vorhergehenden Bruderknoten zurück String getnodevalue() je nach Knotentyp der Wert/Inhalt (oder null) 43

org.w3c.dom.document Element getdocumentelement() Referenz auf das Wurzelelement des Dokuments Element createelement(string tagname) neuer Element-Knoten mit angegebenem Namen Text createtextnode(string data) neuer Text-Knoten DocumentTyp egetdoctype() Document Type Declaration des Dokuments 44

org.w3c.dom.element NodeList getelementsbytagname(string name) Liste von Kindelementen, die einen bestimmten Namen haben String getattribute(string name) Wert des Attributs mit dem angegeben Namen Attr getattributenode(string name) Referenz auf das Attribut mit dem angegeben Namen zurück void removeattribute(string name) Löscht das Attribut mit einem bestimmten Namen 45

Gib mir alle coffee-elemente Elemente! NodeList coffeenodes = document.getelementsbytagname("coffee"); "); getelementsbytagname: direkter Zugriff auf Elemente über ihren Namen egal, wo Elemente stehen Resultat immer eine NodeList <?xml version="1.0"?> <pricelist> <coffee> <name>mocha Java</name> <price>11.95</price> </coffee> </pricelist> 46

Betrachte Elemente der coffee-liste Liste! NodeList coffeenodes = document.getelementsbytagname("coffee"); for (int i=0; i < coffeenodes.getlength(); i++) { thiscoffeenode = coffeenodes.item(i); } coffeenodes.item(0) <?xml version="1.0"?> <pricelist> <coffee> <name>mocha Java</name> <price>11.95</price> </coffee> </pricelist> 47

Gib mir erstes Kind von coffee! NodeList coffeenodes = document.getelementsbytagname("coffee"); for (int i=0; i < coffeenodes.getlength(); i++) { thiscoffeenode = coffeenodes.item(i); Node thisnamenode = thiscoffeenode.getfirstchild(); String data = thisnamenode.getfirstchild().getnodevalue(); if (data.equals("mocha Java")) { Node thispricenode = thiscoffeenode.getnextsibling(); String price = thispricenode.getfirstchild().getnodevalue(); <?xml version="1.0"?> <pricelist> break; } } <coffee> firstchild <name>mocha Java</name> <price>11.95</price> </coffee> </pricelist> 48

Gib mir den Inhalt von name! NodeList coffeenodes = document.getelementsbytagname("coffee"); for (int i=0; i < coffeenodes.getlength(); i++) { thiscoffeenode = coffeenodes.item(i); Node thisnamenode = thiscoffeenode.getfirstchild(); String data = thisnamenode.getfirstchild().getnodevalue(); (); if (data.equals("mocha Java")) { Node thispricenode = thiscoffeenode.getnextsibling(); <?xml version="1.0"?> String price = thispricenode.getfirstchild().getnodevalue(); <pricelist> break; } } <coffee> firstchild Element Node: coffee <name>mocha Java</name> NodeList <price>11.95</price> Element Node: name Element Node: price </coffee> NodeList NodeList </pricelist> Text Node: Mocha Java Text Node: 11.95 49

Gib mir das Geschwister-Element! NodeList coffeenodes = document.getelementsbytagname("coffee"); for (int i=0; i < coffeenodes.getlength(); i++) { thiscoffeenode = coffeenodes.item(i); Node thisnamenode = thiscoffeenode.getfirstchild(); String data = thisnamenode.getfirstchild().getnodevalue(); if (data.equals("mocha Java")) { Node thispricenode = thisnamenode.getnextsibling(); String price = thispricenode.getfirstchild().getnodevalue(); <?xml version="1.0"?> break; } } <pricelist> Element Node: coffee <coffee> nextsibling NodeList <name>mocha Java</name> NodeList Element Node: price NodeList Text Node: 11.95 <price>11.95</price> </coffee> </pricelist> Element Node: name Text Node: Mocha Java 50

Gib mir den Inhalt von price! NodeList coffeenodes = document.getelementsbytagname("coffee"); <?xml version="1.0"?> <pricelist> for (int i=0; i < coffeenodes.getlength(); i++) { <coffee> thiscoffeenode = coffeenodes.item(i); <name>mocha Java</name> Node thisnamenode = thiscoffeenode.getfirstchild(); <price>11.95</price> String data = thisnamenode.getfirstchild().getnodevalue(); </coffee> if (data.equals("mocha Java")) { </pricelist> firstchild Node thispricenode = thisnamenode.getnextsibling(); String price = thispricenode.getfirstchild().getnodevalue(); (); break; } } Element Node: coffee NodeList Element Node: name NodeList Element Node: price NodeList Text Node: Mocha Java Text Node: 11.95 51

Vor- und Nachteile von DOM + Kontext (Parse-Baum) muss nicht von Anwendung verwaltet werden. + einfache Navigation im Parse-Baum + direkter Zugriff auf Elemente über ihre Namen + nicht nur Parsen, sondern auch Modifikation und Erstellung von XML-Dokumenten speicherintensiv abstrahiert nicht von XML-Syntax 52

SAX oder DOM? SAX ereignis-orientierter Ansatz DOM modell-orientierter Ansatz vollständige Umsetzung in eine Baumstruktur mehrere Verarbeitungsmöglichkeiten XML-Dokument als Eingabestrom (Streaming- Verfahren) schnelle Verarbeitung von großen XML-Dokumenten wenig Hauptspeicher benötigt XML-Dokument vollständig im Speicher (Baummodell des Dokuments ) langsame Verarbeitung von großen XML-Dokumenten mehr Hauptspeicher benötigt nach dem Einlesen kann auf alle Teilstrukturen des XML-Dokuments zugegriffen werden 53

Schema-Übersetzer 54

Schema-Übersetzer Java- Objekte XML- Schema Instanz XML- Dokument Übersetzen Validieren Deserialisieren Serialisieren Datenabstraktion Klassen/Methoden werden generiert. Java- Klassen Instanzen Zweck: Schnittstelle, die von XML abstrahiert Lesen, Modifizieren und Erstellen von XML-Dokumenten JAXB: Java Architecture for XML Binding Teil von Java WSDP 2.0 55

Beispiel <pricelist> <coffee> <name>mocha Java</name> <price>11.95</price> </coffee> </pricelist> zugehöriges XML- Schema JAXB public interface PriceList { java.util.list getcoffee(); public interface CoffeeType { String getname(); void setname(string value) java.math.bigdecimal getprice(); void setprice(java.math.bigdecimal value) } } 56

Übersetzung von xsd:choice <xs:element name="boolcommentorvalue"> <xs:complextype> <xs:choice> <xs:element name="bool" type="xs:boolean"/> <xs:element name="comment" type="xs:string"/> <xs:element name="value" type="xs:int"/> </xs:choice> </xs:complextype> </xs:element> Wie kann dieser Datentyp nach Java übersetzt werden? 57

Übersetzung von xsd:choice <xs:element name="boolcommentorvalue"> <xs:complextype> public interface BoolCommentOrValue { <xs:choice> int getvalue(); <xs:element name="bool" type="xs:boolean"/> void setvalue(int value); <xs:element name="comment" boolean type="xs:string"/> issetvalue(); <xs:element name="value" type="xs:int"/> java.lang.string getcomment(); </xs:choice> void setcomment(java.lang.string value); </xs:complextype> boolean issetcomment(); </xs:element> boolean getbool(); void setbool(boolean value); boolean issetbool(); Object getcontent(); boolean issetcontent(); void unsetcontent(); } 58

Vor- und Nachteile von JAXB + bessere Performance bei komplexen Aufgaben + übersichtlicher und robuster weniger fehleranfällig + geringerer Wartungsaufwand + bessere Skalierbarkeit für steigenden Funktionsumfang. + Schnittstelle, die von XML abstrahiert - Keine Unterstützung der Typsubstitution 59

Warum noch XML lernen? Schema-Übersetzer: XML-Schema kann in Java- oder C#-Klassen übersetzt werden. Hiermit können XML-Dokumente gelesen, modifiziert und erstellt werden, ohne dass XML sichtbar ist. Warum sich also noch mit XML und XML- Schemata beschäftigen? 60

Typisches E-BusinessE Business-Projekt Zulieferer Branchenvertreter wollen über das Internet miteinander Geschäfte abwickeln. Sie müssen sich auf ein Austauschformat einigen. 61

E-Business-Projekt: Phase I Welche Geschäftsdaten sollen ausgetauscht werden? Gibt es bereits einen passenden Branchenstandard? Wie sollen die Geschäftsdaten in XML repräsentiert werden? Gibt es bereits einen geeigneten XML-Standard? Ziel: Branchenstandard in Form eines XML-Schemas Software-Architekten entwickeln gemeinsam einen XML-basierten Branchenstandard. 62

E-Business-Projekt: Phase II XML gegeben Branchenstandard in Form eines XML-Schemas gemeinsames Verständnis der XML-Syntax Aufgabe Realisierung der Schnittstelle zwischen betriebsinterner Software und XML-Standard. Programmierer können Schema-Übersetzer einsetzen und von XML abstrahieren. 63

Warum sich mit XML beschäftigen? Phase I: I Software-Architekten beschäftigen sich intensiv mit entsprechender Branche, XML und XML-Schemata. Phase II: Programmierer können Schema-Übersetzer einsetzen und von XML abstrahieren. Projektaufwand Phase I Phase II > 80% 64

Wie geht es weiter? heutige Vorlesung SAX- und DOM-Parser Vor- und Nachteile von SAX und DOM Schema-Übersetzer Übung nächste n Woche 3. Übung: XML Schema Vorlesung nächste n Woche Transformation von XML-Dokumenten mit XSLT 65