• Keine Ergebnisse gefunden

XML XML - - Parser Parser

N/A
N/A
Protected

Academic year: 2022

Aktie "XML XML - - Parser Parser"

Copied!
65
0
0

Wird geladen.... (Jetzt Volltext ansehen)

Volltext

(1)

XML XML - - Parser Parser

(2)

Heutige Vorlesung Heutige Vorlesung

letzte Woche letzte Woche

;; XMLXML--SchemaSchema -- DatentypenDatentypen

-- ElementElement-- und Attributund Attribut--DeklarationenDeklarationen -- TypsubstitutionTypsubstitution

heutige Vorlesung heutige Vorlesung

ƒ Welche XML-Parser gibt es?

ƒ Was sind ihre Vor- und Nachteile?

ƒ Schema-Übersetzer als Alternative

(3)

Grundlegende Architektur Grundlegende Architektur

XML-

Dokument Anwendung

Parser Parser Serialisierer Serialisierer

standardisierte APIs

Parser Parser

ƒ analysiert XML-Dokument und erstellt evtl. Parse-Baum mit Tags, Text-Inhalten und Attribut-Wert-Paaren als Knoten Serialisierer

Serialisierer

ƒ Datenstruktur Î XML-Dokument

Zeichenkette

(4)

Kategorien von Parser Kategorien von Parser

Validierender

Validierender vs. nichtvs. nicht--validierendervalidierender ParserParser

ƒ Wird die Validität des Dokumentes untersucht?

Pull-Pull- vs. Push-vs. Push-ParserParser

ƒ Wer hat Kontrolle über das Parsen: die Anwendung oder der Parser?

Einschritt

Einschritt-- vs. Mehrschrittvs. Mehrschritt--ParserParser

ƒ Wird das XML-Dokument in einem Schritt vollständig geparst oder Schritt für Schritt?

ƒ Beachte: Kategorien unabhängig voneinander, können kombiniert werden

(5)

Validierender

Validierender vs. vs. nicht nicht - - validierender validierender

Validierender

Validierender ParserParser

ƒ Ist das XML-Dokument valide?

ƒ DTD oder XML-Schema erforderlich

ƒ Ist das XML-Dokument wohlgeformt?

Nicht

Nicht--validierendervalidierender ParserParser

ƒ Ist das XML-Dokument wohlgeformt?

(6)

Pull Pull - - Parser Parser

ƒ Anwendung hat Kontrolle über das Parsen.

ƒ Analyse der nächsten syntaktischen Einheit muss aktiv angefordert werden.

ƒ Beachte: „Pull” aus Perspektive der Anwendung.

Pull-Parser

geparste Einheit nächste Einheit?

Anwendung

geparste Einheit nächste Einheit?

(7)

Push Push - - Parser Parser

ƒ 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.

Push-Parser

geparste Einheit

Anwendung

geparste Einheit geparste Einheit

alles Parsen!

(8)

XML XML - - Parser Parser

ƒƒ DOM: Document Object ModelDOM

ƒƒ SAX: Simple API for XMLSAX

One step Multi step

Pull

Push

DOMDOM

SAXSAX

JAXP JAXP

ƒƒ JAXP: Java API for XML JAXP Processing

ƒ JAXP in J2SE 5.0 & Java WSDP 2.0 enthalten

(9)

SAX SAX - - Parser Parser

(10)

SAX: Simple API

SAX: Simple API for for XML XML

ƒƒ Mehrschritt-Mehrschritt-PushPush--Parser füParser für XMLr 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

(11)

Ereignisbasiertes Parsen Ereignisbasiertes Parsen

SAX-Parser

Anwendung

Event Handler

einmaliges Anstoßen des Parsers

Ereignis: neue

syntaktische Einheit geparst

(12)

Beispiel 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 Ereignisfluss Anwendung benachrichtigt.

ƒ Beachte: Es wird kein Parse-Baum aufgebaut!

(13)

Callback

Callback - - Methoden 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

DefaultHandler

ƒ Standard-Implementierung der Callback-Methoden: tun jeweils nichts!

ƒ können natürlich überschrieben werden

(14)

Interface

Interface ContentHandler ContentHandler

ƒƒ startDocumentstartDocument – einmalig zu Beginn des Parsens

ƒƒ endDocumentendDocument – einmalig am Ende des Parsens aufgerufen

ƒƒ startPrefixMappingstartPrefixMapping – wenn eine Präfixbindung für einen Namensraum beginnt

ƒƒ endPrefixMappingendPrefixMapping – wenn eine Präfixbindung für einen Namensraum endet

ƒƒ startElementstartElement – wenn ein Starttag geparst wurde

ƒƒ endElementendElement – wenn ein Endtag geparst wurde

ƒƒ characterscharacters – wenn beim Parsen des Elementinhalts Zeichendaten (#PCDATA) angetroffen werden

(15)

Callback

Callback - - Methode Methode startElement startElement

ƒƒ uri: Namensraum-Bezeichner oder leerer Stringuri

ƒƒ localName: lokaler Name ohne Präfix oder leerer StringlocalName

ƒƒ qName: Name mit Präfix oder leerer StringqName

ƒƒ attributes: zu dem Element gehörige Attributeattributes

ƒ Attribute können über ihre Position (Index) oder ihren Namen zugegriffen werden

ƒƒ endElementendElement ähnlich, jedoch ohne attributes

public void startElement(java.lang.String uri,startElement

java.lang.String localName, java.lang.String qName,

Attributes attributes) throws SAXException

(16)

Callback

Callback - - Methode Methode characters characters

public void characters(char[] buffer, characters int offset,

int length) throws SAXException

buffer: Liste von Zeichen

offset: Anfangsindex offset+length

String s = new String(buffer, offset, length);

(17)

Beispiel Beispiel

<priceList>

<coffee>

<name<name>>

Mocha

Mocha JavaJava

</

</namename> >

<price<price>>

11.95 11.95

</

</priceprice>>

</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

(18)

Wie bekomme ich einen

Wie bekomme ich einen SAX 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

(19)

Exkurs:

Exkurs: Factory Factory Method 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();

(20)

Logik der

Logik der Callback Callback - - Methoden Methoden

<priceList>

<coffee>

<name<name>>

Mocha

Mocha JavaJava

</name>

<price<price>>

11.95 11.95

</price>

</coffee>

</priceList>

Start

inName

inMochaJava

inMJPrice

print(s)

startElement =

"name"?

characters = "Mocha Java"?

startElement = "price"?

characters = "s"?

ƒ Zustände als boolesche Variablen

(21)

Die Die Callback Callback - - Methoden Methoden in Java in Java

public void startElement(..., String startElement(..., String elementNameelementName, ...), ...) { if (elementName.equals("name")){ inName = true; }

else if (elementName.equals("price") && inMochaJava ){

inMJPrice = true;

inMochaJava = false; } }

public void characters(charcharacters(char [] buf[] buf, , intint offset, offset, intint len)len) { String s =

String s = newnew String(bufString(buf, offset, offset, , lenlen););

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

(22)

Start: Auf

Start: Auf < < name name > > warten warten

public void startElement(..., String elementName, ...){ startElement

ifif ((elementName.equals("name")){ elementName.equals("name")){ inNameinName = true= 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; } }

<name><name>Mocha Java</name>

<price>11.95</price>

Start

Start Start

ƒ Anfangszustand

ƒ keine eigene Zustandsvariable

ƒ alle Zustandsvariablen = false

inName

(23)

inName

inName : : Auf Auf " " Mocha Mocha Java" Java" warten warten

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) { characters String s = new String(buf, offset, len);

ifif ((inNameinName && s.equals("Mocha&& s.equals("Mocha Java")) { Java")) { inMochaJava

inMochaJava = true= true; ; inName

inName = false= false; ; }} else if (inMJPrice) {

System.out.println("The price of Mocha Java is: " + s);

inMJPrice = false; } }

<name>MochaMocha Java</name>Java

<price>11.95</price>

Start

inName

inMochaJava

(24)

Eine bessere Alternative Eine bessere Alternative

public void characters(char [] buf, int offset, int len) { characters String s = new String(buf, offset, len);

ifif ((inName) { inName) { ifif ((s.equals("Mochas.equals("Mocha Java")) { Java")) { inMochaJava

inMochaJava = true= true; ; inName

inName = false= false; ; }} elseelse inNameinName = false= false; }; } else if (inMJPrice) {

System.out.println("The price of Mocha Java is: " + s);

inMJPrice = false; } }

<name>MochaMocha Java</name>Java

<price>11.95</price>

Start

inName

inMochaJava

(25)

inMochaJava

inMochaJava : : Auf Auf < < price price > > warten warten

public void startElement(..., String elementName, ...){ startElemen if (elementName.equals("name")){ inName = true; }

else ifif ((elementName.equals("priceelementName.equals("price") && ") && inMochaJavainMochaJava ){ ){

inMJPrice

inMJPrice = true= true; ; inMochaJava

inMochaJava = = falsefalse; ; }} }

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; } }

<name>Mocha Java</name>

<price>

<price>11.95</price>

inName

inMochaJava

inMJPrice

(26)

inMJPrice

inMJPrice : : Preis ausgeben Preis ausgeben

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) { characters String s = new String(buf, offset, len);

if (inName && s.equals("Mocha Java")) { inMochaJava = true;

inName = false; } else ifif ((inMJPrice) { inMJPrice) {

System.out.println("The

System.out.println("The priceprice of of MochaMocha Java Java isis: " + s); : " + s);

inMJPrice

inMJPrice = false= false;; }} }

<name>Mocha Java</name>

<price>11.9511.95</price>

Start

inMJPrice

print(s)

(27)

Fehlerbehandlung Fehlerbehandlung

<priceList>

<coffee>

<<namename>>

Mocha

Mocha JavaJava

</name>

<<namename>>

MS Java MS Java

</name>

<price<price>>

11.95 11.95

</price>

</coffee>

</priceList>

Start

inName

inMochaJava

inMJPrice

print(s)

startElement =

"name"?

characters = "Mocha Java"?

startElement = "price"?

characters = "s"?

(28)

Fehlerbehandlung Fehlerbehandlung

public void startElement(..., String elementName, ...){

if (elementName.equals("name")){ inName = true; } else ifif ((elementName.equals("priceelementName.equals("price") && ") &&

inMochaJava inMochaJava ){ ){

inMJPrice

inMJPrice = true= true; ; inMochaJava

inMochaJava = false= false; ; }} }

<name>Mocha Java</name>

<name>MS Java</name>

<price>11.95</price>

inName

inMochaJava

inMJPrice

ƒ 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!

(29)

Fehlerbehandlung 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.

(30)

Vor Vor - - und Nachteile von SAX 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

(31)

Zus Zus ä ä tzliche Schicht zum Datenzugriff tzliche Schicht zum Datenzugriff

Anwendung

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

SAX Datenzugriff

Datenzugriff getPriceList()

SAX

startElement characters

(32)

DOM DOM - - Parser Parser

(33)

Document

Document Object Object Model (DOM) Model (DOM)

ƒ 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 EinschrittEinschritt--Pull-Pull-ParserParser XML-

Parser DOMDOM Anwendung

(34)

DOM 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,

(35)

DOM- DOM - Parse- Parse -B ä ume 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

ƒƒ DocumentDocument Node: virtuelle Dokument-Wurzel, um z.B. Node version="1.0" zu repräsentieren

ƒ Document Node und Element Node immer NodeListList als Kind

(36)

Rest des

Rest des Parse Parse - - Baumes 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

Element Node: name NodeList

Text Node: Mocha Java

Element Node: price NodeList

Text Node: 11.95 NodeList

(37)

Navigationsmodell Navigationsmodell

direkter Zugriff über Namen möglich: getElementsByTagName

Node

previousSibling nextSibling

childNodes

firstChild

parentNode

lastChild

(38)

Beispiel Beispiel

<priceList>

<coffee>

<name<name>>

Mocha

Mocha JavaJava

</

</namename> >

<price<price>>

11.95 11.95

</

</priceprice>>

</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

(39)

Wie bekomme ich einen

Wie bekomme ich einen DOM DOM - - Parser Parser ? ?

DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();

ƒ liefert DOM-Parser

DocumentBuilder builder = factory.newDocumentBuilder();

Document document = builder.parse("priceList.xml");

ƒ liefert DocumentBuilderFactory

ƒ DOM-Parser hat Methode parse().

ƒ liefert in einem Schritt kompletten DOM-Parse-Baum

(40)

Wie sehen die Zugriffsmethoden aus?

Wie sehen die Zugriffsmethoden aus?

NodeList coffeeNodes = document.getElementsByTagName("coffeedocument.getElementsByTagName("coffee");");

for (int i=0; i < coffeeNodes.getLength(); i++) { thisCoffeeNode = coffeeNodes.item(i);

Node thisNameNode = thisCoffeeNode.getFirstChild();thisCoffeeNode.getFirstChild();

String data = thisNameNode.getFirstChild().getNodeValue(); thisNameNode.getFirstChild().getNodeValue();

if (data.equals("Mocha Java")) {

Node thisPriceNode = thisNameNode.getNextSiblingthisNameNode.getNextSibling(); ();

String price = thisPriceNode.getFirstChild().getNodeValue(); thisPriceNode.getFirstChild().getNodeValue();

break; } }

= Java-Programm, das DOM- Methoden benutzt

(41)

Interface Hierarchie Interface Hierarchie

DOMImplementation

NamedNodeMap

NodeList Node

Atr

DocumentFragment Document

CharacterData

DocumentType Element

Entity

EntityReference Notation

PrrocessingInstruction

Comment Text

interfaceorg.w3c.dom.

(42)

org.w3c.dom.NodeList 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

(43)

org.w3c.dom.Node 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()

ƒ Node getNextSibling()

Node getPreviousSibling()

ƒ String getNodeValue() Æ je nach Knotentyp der Wert/Inhalt (oder null)

Referenz auf den nachfolgenden/

vorhergehenden Bruderknoten zurück

Liefert eine Referenz auf den

ersten/letzen Kinderknoten zurück

(44)

org.w3c.dom.Document 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

(45)

org.w3c.dom.Element 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

(46)

Gib mir alle

Gib mir alle coffee coffee - - Elemente Elemente ! !

NodeList

NodeList coffeeNodescoffeeNodes = document.getElementsByTagName("coffee= document.getElementsByTagName("coffee");");

<?xml version="1.0" ?>

<priceList>

<coffee>

<name>Mocha Java</name>

<price>11.95</price>

</coffee>

</priceList>

ƒ getElementsByTagName:

direkter Zugriff auf Elemente über ihren Namen

ƒ egal, wo Elemente stehen

ƒ Resultat immer eine NodeList

(47)

Betrachte Elemente der

Betrachte Elemente der coffee coffee - - Liste Liste ! !

NodeList coffeeNodes = document.getElementsByTagName("coffee");

forfor ((intint i=0; i < coffeeNodes.getLengthi=0; i < coffeeNodes.getLength(); i++) { (); i++) { thisCoffeeNode

thisCoffeeNode = = coffeeNodes.item(icoffeeNodes.item(i););

} <?xml version="1.0" ?>

<priceList>

<coffee>

<name>Mocha Java</name>

<price>11.95</price>

</coffee>

</priceList>

coffeeNodes.item(0)

(48)

Gib mir erstes Kind von

Gib mir erstes Kind von coffee coffee ! !

NodeList coffeeNodes = document.getElementsByTagName("coffee");

for (int i=0; i < coffeeNodes.getLength(); i++) { thisCoffeeNode = coffeeNodes.item(i);

NodeNode thisNameNodethisNameNode = thisCoffeeNode.getFirstChild= thisCoffeeNode.getFirstChild();();

String data = thisNameNode.getFirstChild().getNodeValue();

if (data.equals("Mocha Java")) {

Node thisPriceNode = thisCoffeeNode.getNextSibling();

String price = thisPriceNode.getFirstChild().getNodeValue();

break; } }

<?xml version="1.0" ?>

<priceList>

<coffee>

<name>Mocha Java</name>

<price>11.95</price>

</coffee>

</priceList>

firstChild

(49)

Gib mir den Inhalt von

Gib mir den Inhalt von name name ! !

NodeList coffeeNodes = document.getElementsByTagName("coffee");

for (int i=0; i < coffeeNodes.getLength(); i++) { thisCoffeeNode = coffeeNodes.item(i);

Node thisNameNode = thisCoffeeNode.getFirstChild();

String

String datadata = thisNameNode.getFirstChild().getNodeValue= thisNameNode.getFirstChild().getNodeValue();();

if (data.equals("Mocha Java")) {

Node thisPriceNode = thisCoffeeNode.getNextSibling();

String price = thisPriceNode.getFirstChild().getNodeValue();

break; } }

<?xml version="1.0" ?>

<priceList>

<coffee>

<name>Mocha Java</name>

<price>11.95</price>

</coffee>

</priceList>

firstChild

Element Node: coffee

Element Node: name NodeList

Text Node: Mocha Java

Element Node: price NodeList Text Node: 11.95 NodeList

Element Node: coffee

Element Node: name NodeList

Text Node: Mocha Java

Element Node: price NodeList Text Node: 11.95 NodeList

(50)

Gib mir das Geschwister

Gib mir das Geschwister - - Element! 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();

ifif ((data.equals("Mochadata.equals("Mocha Java")) {Java")) {

NodeNode thisPriceNodethisPriceNode = thisNameNode.getNextSibling= thisNameNode.getNextSibling(); ();

String price = thisPriceNode.getFirstChild().getNodeValue();

break; } }

<?xml version="1.0" ?>

<priceList>

<coffee>

<name>Mocha Java</name>

<price>11.95</price>

</coffee>

</priceList>

nextSibling

Element Node: coffee

Element Node: name NodeList

Text Node: Mocha Java

Element Node: price NodeList Text Node: 11.95 NodeList

Element Node: coffee

Element Node: name NodeList

Text Node: Mocha Java

Element Node: price NodeList Text Node: 11.95 NodeList

(51)

Gib mir den Inhalt von

Gib mir den Inhalt von price price ! !

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

String priceprice = = thisPriceNode.getFirstChild().getNodeValue();thisPriceNode.getFirstChild().getNodeValue();

break; } }

<?xml version="1.0" ?>

<priceList>

<coffee>

<name>Mocha Java</name>

<price>11.95</price>

</coffee>

</priceList> firstChild

Element Node: coffee

Element Node: name NodeList

Text Node: Mocha Java

Element Node: price NodeList Text Node: 11.95 NodeList

Element Node: coffee

Element Node: name NodeList

Text Node: Mocha Java

Element Node: price NodeList Text Node: 11.95 NodeList

(52)

Vor Vor - - und Nachteile von DOM 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

(53)

SAX oder DOM?

SAX oder DOM?

SAX SAX DOMDOM

ereignis-orientierter Ansatz modell-orientierter Ansatz vollständige Umsetzung in eine Baumstruktur

mehrere Verarbeitungsmöglichkeiten XML-Dokument als

Eingabestrom (Streaming- Verfahren)

XML-Dokument vollständig im Speicher (Baummodell des

Dokuments ) schnelle Verarbeitung von großen

XML-Dokumenten

langsame Verarbeitung von großen XML-Dokumenten

wenig Hauptspeicher benötigt mehr Hauptspeicher benötigt nach dem Einlesen kann auf alle Teilstrukturen des XML-Dokuments zugegriffen werden

(54)

Schema

Schema - - Ü Ü bersetzer bersetzer

(55)

Schema

Schema- - Ü Ü bersetzer bersetzer

ƒƒ JAXB: Java Architecture for XML BindingJAXB

ƒ Teil von Java WSDP 2.0

XML- Dokument

XML- Dokument

Java- Klassen

Java- Klassen

Java- Objekte

Java- Objekte XML-

Schema XML- Schema

Instanzen Instanz

Validie ren Serialisieren Deserialisieren

Übersetzen

Datenabstraktion ƒ Klassen/Methoden werden generiert.

ƒ Zweck: Schnittstelle, die von XML

abstrahiert

ƒ Lesen, Modifizieren und Erstellen von XML-Dokumenten

(56)

<priceList>

<coffee>

<name>Mocha Java</name>

<price>11.95</price>

</coffee>

</priceList>

Beispiel Beispiel

public interface PriceList { java.util.List getCoffee();getCoffee

public interface CoffeeType { String getNamegetName();

void setName(String value)setName

java.math.BigDecimal getPrice(); getPrice

void setPrice(java.math.BigDecimal value) } }setPrice

zugehöriges XML- Schema

JAXB

(57)

Ü Ü bersetzung von bersetzung von xsd:choice 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?

(58)

Ü Ü bersetzung von bersetzung von xsd:choice 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>

public interface BoolCommentOrValue { int getValue(); getValue

void setValue(int value); setValue boolean isSetValue(); isSetValue

java.lang.String getComment(); getComment

void setCommentsetComment(java.lang.String value); (java.lang.String boolean isSetComment(); isSetComment

boolean getBool(); getBool

void setBool(boolean value); setBoo boolean isSetBool(); isSetBool

Object getContent(); getContent boolean isSetContent(); isSetContent void unSetContent(); } unSetContent

(59)

Vor Vor - - und Nachteile von JAXB 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

(60)

Warum noch XML lernen?

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?

(61)

Typisches E

Typisches E- - Business Business - - Projekt Projekt

Zulieferer

ƒ Branchenvertreter wollen über das Internet miteinander Geschäfte abwickeln.

ƒ Sie müssen sich auf ein Austauschformat einigen.

(62)

E E - - Business Business - - Projekt: Phase I 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.

(63)

E E -Business - Business- -Projekt: Phase II Projekt: Phase II

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.

XML

(64)

Warum sich mit XML besch

Warum sich mit XML beschä ä ftigen? ftigen?

ƒƒ Phase I: Software-Architekten beschäftigen sich intensiv Phase I mit entsprechender Branche, XML und XML-Schemata.

ƒƒ Phase II: Programmierer können Schema-Übersetzer Phase II einsetzen und von XML abstrahieren.

Phase I

Phase I Phase IIPhase II

> 80%

Projektaufwand Projektaufwand

(65)

Wie geht es weiter?

Wie geht es weiter?

heutige Vorlesung heutige Vorlesung

; SAX- und DOM-Parser

; Vor- und Nachteile von SAX und DOM

; Schema-Übersetzer Übung nÜbung näächste Wochechste Woche

ƒ 3. Übung: XML Schema Vorlesung n

Vorlesung näächste Wochechste Woche

ƒ Transformation von XML-Dokumenten mit XSLT

Referenzen

ÄHNLICHE DOKUMENTE

10 RINT RECEIVER INTERRUPT is set after the chip updatcs &lt;III clltry in the Receive Dcscriptor Ring. RINT is RCild/Clear Ollly and is set hy thc chip and cleared

Important: the error symbol should always be followed by a terminal synchronization symbol, SEMI in this

Wer hat Kontrolle über das Parsen: die Anwendung oder der

Wer hat Kontrolle über das Parsen: die Anwendung oder der

Following careful microscopic haruspication, as far as the person, surgeon, and collaborating pathologist are aware, there exist 5 lymph nodes, 1 of which harbors a metastatic focus

Den kanonischen LR ( k ) -Automaten LR ( G, k ) erhält man aus c ( G, k ) , indem man nach jedem Übergang beliebig viele ǫ liest und dann den Automaten deterministisch macht .....

The two different similarity measures derived from spreading activation processes allow on the one hand for the identification of structurally similar nodes to a given query node,

The two different similarity measures derived from spreading activation processes allow on the one hand for the identification of structurally similar nodes to a given query node,