• Keine Ergebnisse gefunden

Verarbeitung von XML XML- - Dokumenten

N/A
N/A
Protected

Academic year: 2022

Aktie "Verarbeitung von XML XML- - Dokumenten"

Copied!
9
0
0

Wird geladen.... (Jetzt Volltext ansehen)

Volltext

(1)

© Klaus Schild, 2003 1

Verarbeitung von

Verarbeitung von XML XML- - Dokumenten

Dokumenten

© Klaus Schild, 2003 2

Lernziele Lernziele

ƒ

Welche verschiedenen XML-Parser gibt es?

ƒ

Was sind ihre Vor- und Nachteile?

ƒ

Was sind Schema-Übersetzer?

© Klaus Schild, 2003 3

Grundlegende Architektur Grundlegende Architektur

XML-

Dokument Anwendung

Parser Serialisierer

standardisierte APIs

ƒ Möglichst immer standardisierte APIs verwenden!

ƒ Parser: Analysiert XML-Dokument und erstellt Parse-Baum mit Tags, Text-Inhalten und Attribut-Wert-Paaren als Knoten.

ƒ Serialisierer: Generiert aus bestimmter Datenstruktur ein XML- Dokument.

Zeichenkette

© Klaus Schild, 2003 4

Kategorien von Parser Kategorien von Parser

ƒ

Pull- vs. Push-Parser:

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

ƒ

Einschritt- vs. Mehrschritt-Parser (engl. one-step vs. multi-

step parsing):

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

ƒ

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

Pull Pull- -Parser Parser

ƒ

Anwendung hat die Kontrolle über das Parsen.

ƒ

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

ƒ

Beachte: „Pull” bezieht sich auf die Perspektive der Anwendung.

Pull-Parser

geparste Einheit nächste Einheit?

Anwendung

Push Push- -Parser Parser

ƒ

Parser hat die Kontrolle über das Parsen.

ƒ

Sobald der Parser eine syntaktische Einheit analysiert hat, benachrichtigt er die Anwendung und übergibt die entsprechende Analyse.

ƒ

Beachte: „Push” bezieht sich wiederum auf die Perspektive der Anwendung.

Push-Parser

geparste Einheit

Anwendung

(2)

© Klaus Schild, 2003 7

XML XML- -Parser Parser

ƒ

DOM: Document Object Model

ƒ

SAX: Simple API for XML

One-step Multi-step

Pull

Push

DOM

DOM

SAX

SAX

JAXP

ƒ

JAXP: Java API for XML Processing

© Klaus Schild, 2003 8

SAX- SAX -Parser Parser

© Klaus Schild, 2003 9

Simple API

Simple API for for XML (SAX) XML (SAX)

ƒ

standardisiertes API für Mehrschritt-Push-Parsen von XML-Dokumenten

ƒ

ursprünglich nur Java-API, inzwischen werden aber auch viele andere Sprachen unterstützt

ƒ

kein W3C-Standard, sondern de facto Standard

Î

http://www.saxproject.org/

© Klaus Schild, 2003 10

Ereignisbasiertes Parsen mit SAX Ereignisbasiertes Parsen mit SAX

SAX-Parser

Anwendung

Event Handler

Aufforderung

zum Parsen

Ereignis: neue syntaktische Einheit geparst

Beispiel für

Beispiel für ereignisbasiertes ereignisbasiertes Parsen Parsen

<priceList>

<coffee>

<name>

Mocha Java

</name>

<price>

11.95

</price>

</coffee>

</priceList>

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

ƒ

Sobald eine Einheit geparst wurde, wird die Anwendung benachrichtigt (Ereignisfluss).

ƒ

Beachte: Es wird kein Parse-Baum aufgebaut!

Callback

Callback- -Methoden Methoden

ƒ

startElement, endElement und characters werden Call-Back- Methoden genannt, weil sie vom Parser aufgerufen werden.

ƒ

für jede syntaktische Struktur in XML eine eigene Callback-Methode

ƒ

Die Standard-Implementierung der Call-Back-Methoden (DefaultHandler) tut jeweils nichts.

ƒ

Standard-Implementierungen können aber entsprechend

den Erfordernissen überschrieben werden.

(3)

© Klaus Schild, 2003 13

Beispiel Beispiel

<priceList>

<coffee>

<name>

Mocha Java

</name>

<price>

11.95

</price>

</coffee>

</priceList>

<priceList>

<coffee>

<name>

Mocha Java

</name>

<price>

11.95

</price>

</coffee>

</priceList>

ƒ

Aufgabe: Gib des Preis von Mocha Java aus!

ƒ

Hierfür benötigen wir zwei Dinge:

1. einen SAX-Parser 2. passende Callback-

Methoden

© Klaus Schild, 2003 14

Ein SAX Ein SAX- -Parser Parser

SAXParserFactory factory = SAXParserFactory.newInstance();

SAXParser saxParser = factory.newSAXParser();

saxParser.parse("priceList.xml", handler);

SAXParserFactory factory = SAXParserFactory.newInstance();

SAXParser saxParser = factory.newSAXParser();

saxParser.parse("priceList.xml", handler);

ƒ

SAXParserFactory.newInstance() liefert eine SAXParserFactory.

ƒ

Die Methode newSAXParser() liefert einen SAXParser mit einer Methode parse().

ƒ

priceList.xml: die zu parsende Datei (kann auch eine URL oder ein Stream sein)

ƒ

handler: Instanz von DefaultHandler, implementiert die Callback-Funktionen

© Klaus Schild, 2003 15

Exkurs:

Exkurs: Factory Factory Method Method

ƒ

Design Pattern aus „Design Patterns“ von Gamma, Helm, Johnson, Vlissides (1995)

ƒ

liefert ein Objekt

ƒ

Objekt ist Instanz einer abstrakten Klasse oder einem Interface.

ƒ

wird von mehreren Klassen implementiert

ƒ

Beispiel: Iterator i = list.iterator();

ƒ

Beispiel: SAXParser saxParser = factory.newSAXParser();

© Klaus Schild, 2003 16

Die

Die Callback Callback- -Methoden Methoden

<priceList>

<coffee>

<name>

Mocha Java

</name>

<price>

11.95

</price>

</coffee>

</priceList>

<priceList>

<coffee>

<name>

Mocha Java

</name>

<price>

11.95

</price>

</coffee>

</priceList>

Start

inName

inMochaJava

inPrice

print(s)

startElement = name?

characters = Mocha Java?

startElement = price?

characters = s?

Aufgabe: Gib den Preis von Mocha Java aus!

Die

Die Callback Callback- -Methoden Methoden

public voidstartElement(..., String elementName, ...) { if (elementName.equals("name")){ inName = true; } else if (elementName.equals("price") && inMochaJava ){

inPrice = true;

inName = false; } }

public voidstartElement(..., String elementName, ...) { if (elementName.equals("name")){ inName = true; } else if (elementName.equals("price") && inMochaJava ){

inPrice = true;

inName = false; } }

public voidcharacters(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 (inPrice) {

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

inMochaJava = false;

inPrice = false; } }

public voidcharacters(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 (inPrice) {

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

inMochaJava = false;

inPrice = false; } }

Auf

Auf < <name name> > warten warten

public voidstartElement(..., String elementName, ...){

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

inPrice = true;

inName = false; } }

public voidstartElement(..., String elementName, ...){

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

inPrice = true;

inName = 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 (inPrice) {

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

inMochaJava = false;

inPrice = 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 (inPrice) {

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

inMochaJava = false;

inPrice = false; } }

<name>Mocha Java</name>

<price>11.95</price>

<name>Mocha Java</name>

<price>11.95</price>

Start

inName

(4)

© Klaus Schild, 2003 19

A

Auf uf " "Mocha Mocha Java" Java" warten warten

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

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

inPrice = true;

inName = false; } }

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

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

inPrice = true;

inName = false; } }

public voidcharacters(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 (inPrice) {

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

inMochaJava = false;

inPrice = false; } }

public voidcharacters(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 (inPrice) {

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

inMochaJava = false;

inPrice = false; } }

<name>Mocha Java</name>

<price>11.95</price>

<name>Mocha Java</name>

<price>11.95</price>

Start

inName

inMochaJava

© Klaus Schild, 2003 20

Auf < Auf <price price> > warten warten

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

if (elementName.equals("name")){ inName = true; } elseif (elementName.equals("price") && inMochaJava ){

inPrice = true;

inName = false; }}

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

if (elementName.equals("name")){ inName = true; } elseif (elementName.equals("price") && inMochaJava ){

inPrice = true;

inName = 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 (inPrice) {

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

inMochaJava = false;

inPrice = 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 (inPrice) {

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

inMochaJava = false;

inPrice = false; } }

<name>Mocha Java</name>

<price>11.95</price>

<name>Mocha Java</name>

<price>11.95</price>

inName

inMochaJava

inPrice

© Klaus Schild, 2003 21

Den Preis ausgeben Den Preis ausgeben

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

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

inPrice = true;

inName = false; } }

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

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

inPrice = true;

inName = false; } }

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

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

inName = false; } elseif (inPrice) {

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

inMochaJava = false;

inPrice = false; } }

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

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

inName = false; } elseif (inPrice) {

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

inMochaJava = false;

inPrice = false; } }

<name>Mocha Java</name>

<price>11.95</price>

<name>Mocha Java</name>

<price>11.95</price>

Start

inPrice

print(s)

© Klaus Schild, 2003 22

Fehlerbehandlung Fehlerbehandlung

<priceList>

<coffee>

<name>

Mocha Java

</name>

<name>

MS Java

</name>

<price>

11.95

</price>

</coffee>

</priceList>

<priceList>

<coffee>

<name>

Mocha Java

</name>

<name>

MS Java

</name>

<price>

11.95

</price>

</coffee>

</priceList>

Start

inName

inMochaJava

inPrice

print(s)

startElement = name?

characters = Mocha Java?

startElement = price?

characters = s?

Fehlerbehandlung Fehlerbehandlung

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

if (elementName.equals("name")){ inName = true; } elseif (elementName.equals("price") && inMochaJava ){

inPrice = true;

inName = false; }}

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

if (elementName.equals("name")){ inName = true; } elseif (elementName.equals("price") && inMochaJava ){

inPrice = true;

inName = false; }} <name>Mocha Java</name>

<name>MS Java</name>

<price>11.95</price>

<name>Mocha Java</name>

<name>MS Java</name>

<price>11.95</price>

inName

inMochaJava

inPrice

ƒ

inMochaJava erwartet price-Element

ƒ

Kommt ein name-Element, wird der Zustand einfach nicht verändert.

ƒ

Kommt danach ein price-Element, wird der aktuelle Zustand inPrice.

ƒ

Dadurch wird der Preis von MS Java ausgegeben!

Fehlerbehandlung Fehlerbehandlung

ƒ

Ein SAX-Parser überprüft immer die Wohlgeformtheit eines XML-Dokumentes.

ƒ

kann aber auch die Zulässigkeit bzgl. einer DTD oder eines Schema überprüfen

ƒ

Syntax- und Strukturfehler fängt bereits der SAX-Parser ab.

ƒ

Callback-Methoden können von einem wohlgeformten

und zulässigen Dokument ausgehen.

(5)

© Klaus Schild, 2003 25

Vor Vor- - und Nachteile von SAX und Nachteile von SAX

+ sehr effizient, auch bei großen XML-Dateien

– Kontext (Parse-Baum) muss von der Anwendung selbst verwaltet werden.

– abstrahiert nicht von der spezifischen XML-Syntax – nur Parsen von XML-Dokumenten möglich, keine

Modifikation oder Erstellung von Dokumenten

© Klaus Schild, 2003 26

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

Anwendung

Anwendungslogik

ƒ

Immer Anwendungslogik durch spezielle Schicht von dem 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 der XML-Syntax abstrahieren

SAX

Datenzugriff

Datenzugriff getPriceList()

SAX

startElement characters

© Klaus Schild, 2003 27

DOM- DOM -Parser Parser

© Klaus Schild, 2003 28

Document

Document Object Object Model (DOM) Model (DOM)

ƒ

W3C-Standard zum Zugreifen, Modifizieren und Erstellen von Parse-Bäumen

ƒ

nicht nur für XML-, sondern auch für HTML-Dokumente

ƒ

abstrakte Schnittstelle, unabhängig von Programmiersprachen

ƒ

im Ergebnis ein Einschritt-Pull-Parser XML-

Parser DOM Anwendung

DOM

DOM- -Parse Parse- -Bäume Bäume

<?xml version="1.0" ?>

<priceList>

<coffee>

<name>Mocha Java</name>

<price>11.95</price>

</coffee>

</priceList>

<?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: In DOM ist nicht priceList die Dokument-Wurzel.

ƒ

DOM führt virtuelle Dokument-Wurzel ein, um syntaktische Einheiten außerhalb von priceList (wie version="1.0") repräsentieren zu können.

DOM

DOM- -Parse Parse- -Bäume Bäume

<?xml version="1.0" ?>

<priceList>

<coffee>

<name>Mocha Java</name>

<price>11.95</price>

</coffee>

</priceList>

<?xml version="1.0" ?>

<priceList>

<coffee>

<name>Mocha Java</name>

<price>11.95</price>

</coffee>

</priceList>

ƒ

Beachte: Text-Inhalte werden als eigene Knoten dargestellt.

Element Node: coffee

Element Node: name NodeList Text Node: Mocha Java

Element Node: price NodeList Text Node: 11.95 NodeList

(6)

© Klaus Schild, 2003 31

Navigationsmodell Navigationsmodell

parentNode

previousSibling NodeNode nextSibling childNodes

firstChild lastChild

© Klaus Schild, 2003 32

Beispiel Beispiel

<priceList>

<coffee>

<name>

Mocha Java

</name>

<price>

11.95

</price>

</coffee>

</priceList>

<priceList>

<coffee>

<name>

Mocha Java

</name>

<price>

11.95

</price>

</coffee>

</priceList>

ƒ

Aufgabe: Gib des Preis von Mocha Java aus!

ƒ

Hierfür benötigen wir zwei Dinge:

1. einen DOM-Parser 2. eine passende

Zugriffsmethode

© Klaus Schild, 2003 33

Ein

Ein DOM DOM- -Parser Parser

DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();

DocumentBuilder builder = factory.newDocumentBuilder();

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

DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();

DocumentBuilder builder = factory.newDocumentBuilder();

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

ƒ

DocumentBuilderFactory.newInstance() liefert eine DocumentBuilderFactory.

ƒ

Die Methode newDocumentBuilder() von DocumentBuilderFactory liefert einen DOM-Parser.

ƒ

Der DOM-Parser hat eine Methode parse().

© Klaus Schild, 2003 34

Zugriffsmethoden Zugriffsmethoden

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

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

<?xml version="1.0" ?>

<priceList>

<coffee>

<name>Mocha Java</name>

<price>11.95</price>

</coffee>

</priceList>

<?xml version="1.0" ?>

<priceList>

<coffee>

<name>Mocha Java</name>

<price>11.95</price>

</coffee>

</priceList>

ƒ

Direkter Zugriff auf bestimmte Elemente mit getElementsByTagName möglich.

ƒ

Resultat ist eine NodeList.

Zugriffsmethoden Zugriffsmethoden

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

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

}

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

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

}

<?xml version="1.0" ?>

<priceList>

<coffee>

<name>Mocha Java</name>

<price>11.95</price>

</coffee>

</priceList>

<?xml version="1.0" ?>

<priceList>

<coffee>

<name>Mocha Java</name>

<price>11.95</price>

</coffee>

</priceList>

coffeeNodes.item(0)

Zugriffsmethoden Zugriffsmethoden

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();

break; } }

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();

break; } }

<?xml version="1.0" ?>

<priceList>

<coffee>

<name>Mocha Java</name>

<price>11.95</price>

</coffee>

</priceList>

<?xml version="1.0" ?>

<priceList>

<coffee>

<name>Mocha Java</name>

<price>11.95</price>

</coffee>

</priceList>

firstChild

(7)

© Klaus Schild, 2003 37

DOM DOM- -Methoden Methoden

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();

break; } }

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();

break; } }

<?xml version="1.0" ?>

<priceList>

<coffee>

<name>Mocha Java</name>

<price>11.95</price>

</coffee>

</priceList>

<?xml version="1.0" ?>

<priceList>

<coffee>

<name>Mocha Java</name>

<price>11.95</price>

</coffee>

</priceList>

firstChild

ƒ

Beachte: getFirstChild() liefert den Text-Knoten, nicht dessen Inhalt „Mocha Java“!

© Klaus Schild, 2003 38

DOM- DOM -Methoden Methoden

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

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

<?xml version="1.0" ?>

<priceList>

<coffee>

<name>Mocha Java</name>

<price>11.95</price>

</coffee>

</priceList>

<?xml version="1.0" ?>

<priceList>

<coffee>

<name>Mocha Java</name>

<price>11.95</price>

</coffee>

</priceList>

nextSibling

© Klaus Schild, 2003 39

DOM

DOM- -Methoden Methoden

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

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

<?xml version="1.0" ?>

<priceList>

<coffee>

<name>Mocha Java</name>

<price>11.95</price>

</coffee>

</priceList>

<?xml version="1.0" ?>

<priceList>

<coffee>

<name>Mocha Java</name>

<price>11.95</price>

</coffee>

</priceList>

firstChild

© Klaus Schild, 2003 40

Vor

Vor- - und Nachteile von DOM und Nachteile von DOM

+ Kontext (Parse-Baum) muss nicht von der Anwendung verwaltet werden.

+ direkter Zugriff auf Elemente und Attribute über ihre Namen (unabhängig von deren Position) möglich + Nicht nur Parsen von XML-Dokumenten möglich,

sondern auch Modifikation und Erstellung von Dokumenten.

– speicherintensiv

SAX oder DOM?

SAX oder DOM?

ƒ

SAX ist geeignet, um gezielt bestimmte Teile von XML- Dokumenten herauszufiltern, ohne zu einem späteren Zeitpunkt andere Teile des Dokumentes zu benötigen.

ƒ

DOM ist geeignet, um auf unterschiedliche Teile eines XML-Dokumentes zu verschiedenen Zeitpunkten zuzugreifen.

ƒ

DOM ist zum Erstellen und Modifizieren von Dokumenten geeignet, SAX ist hierfür ungeeignet.

Schema

Schema- -Übersetzer Übersetzer

(8)

© Klaus Schild, 2003 43

Schema

Schema- -Übersetzer Übersetzer

XML- Dokument

Java- Klassen

Java- Objekte XML-

Schema

Instanzen Instanz

Validie ren

Serialisieren Deserialisieren

Übersetzen

Datenabstraktion

Î

Java Architecture for XML Binding (JAXB)

© Klaus Schild, 2003 44

Beispiel Beispiel

<priceList>

<coffee>

<name>Mocha Java</name>

<price>11.95</price>

</coffee>

</priceList>

<priceList>

<coffee>

<name>Mocha Java</name>

<price>11.95</price>

</coffee>

</priceList>

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

PriceList-Schema

JAXB

© Klaus Schild, 2003 45

Marshalling

Marshalling/ /Unmarshalling Unmarshalling

XML-

Dokument Java-

Objekte Serialisieren

Deserialisieren

ƒ

Serialisieren (marshalling) generiert aus Datenstrukturen der Anwendung ein XML-Dokument.

ƒ to marshal

= ordnen (Fakten), antreten lassen (Soldaten)

ƒ

Deserialisieren (unmarshalling) erstellt keinen Parse- Baum, sondern Java-Objekte mit Methoden zum Zugreifen und Modifizieren der Daten.

marshal

unmarshal

© Klaus Schild, 2003 46

Warum sich noch mit XML beschäftigen?

Warum sich noch mit XML beschäftigen?

ƒ

Mit Hilfe eines Schema-Übersetzers kann eine Anwendung vollständig von XML abstrahieren.

ƒ

Voraussetzung: XML-Schema oder eine DTD

ƒ

Ein Anwendungsentwickler kann das XML-Schema in Java oder C# übersetzen und mit dem generierten Code XML-Dokumente lesen, modifizieren und erstellen.

Warum sollte sich also ein Anwendungsentwickler überhaupt noch mit XML oder XML-Schemata

beschäftigen?

Warum sollte sich also ein Anwendungsentwickler überhaupt noch mit XML oder XML-Schemata

beschäftigen?

Typisches E

Typisches E- -Business Business- -Projekt Projekt

Zulieferer

ƒ

Branchenvertreter wollen miteinander Geschäfte über das Internet machen.

ƒ

Sie müssen sich auf ein Austauschformat einigen.

Typisches E

Typisches E- -Business Business- -Projekt: Phase I Projekt: Phase I

ƒ

Welche Geschäftsdaten sollen ausgetauscht werden?

ƒ

Gibt es bereits einen passenden Branchenstandard (nicht unbedingt XML-basiert)?

ƒ

Wie sollen diese 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 (= XML-Schema).

Software-Architekten entwickeln

gemeinsam einen XML-basierten

Branchenstandard (= XML-Schema).

(9)

© Klaus Schild, 2003 49

Typisches E

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

ƒ

Branchenstandard liegt in Form eines XML-Schemas vor.

ƒ

Es gibt ein gemeinsames Verständnis der verwendeten XML-Syntax.

ƒ

Aufgabe: Realisierung der Schnittstelle zwischen betriebsinterner Software und dem XML-Standard.

Programmierer können Schema-Übersetzer einsetzen und von der XML-Syntax abstrahieren.

Programmierer können Schema-Übersetzer einsetzen und von der XML-Syntax abstrahieren.

XML

© Klaus Schild, 2003 50

Warum sich noch mit XML beschäftigen?

Warum sich noch mit XML beschäftigen?

ƒ

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

Referenzen

ÄHNLICHE DOKUMENTE

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

ƒ Beachte: Von Browsern wird White Space allerdings nicht angezeigt:.

Element Node: price NodeList Text Node: 11.95 NodeList. Element

alle Zeichen erlaubt, die nicht ausdrücklich verboten.

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

• Sobald der Parser eine syntaktische Einheit analysiert hat, benachrichtigt er die Anwendung und übergibt die entsprechende Analyse.. • Beachte: „Push” bezieht sich wiederum

ƒ Für jedes Element kann ein Namensraum als Standard (default) festgelegt werden,

ƒ Eine Ortsangabe besteht aus dem Breitengrad, dem Längengrad und einem Maß für die Unsicherheit der beiden Angaben. ƒ Ein Breitengrad ist eine Dezimalzahl zwischen -90