Java und XML

Werbung
Praktikum aus
Softwareentwicklung 2
Java und XML
Praktikum aus Softwareentwicklung 2
Java Praktikum – SS 2009 – [email protected]
1
Praktikum aus
Softwareentwicklung 2
Java und XML
•
•
•
•
Einführung in XML
–
Merkmale von XML
SAX
–
Grundlagen, Verwendung in Java, …
DOM
–
Grundlagen, Verwendung in Java, …
Validierung
–
DTD, XML Schema
Java Praktikum – SS 2009 – [email protected]
2
Praktikum aus
Softwareentwicklung 2
Motivation für XML
HTML versus XML
HTML beschreibt
Layout des Dokumentinhalts
<h1>HandyKatalog</h1>
<h2>Nokia 8210</h2>
<table border="1">
<tr>
<td>Batterie</td>
<td>900mAh</td>
</tr>
<tr>
XML beschreibt
Struktur u. Semantik d. Dokumentinhalts
<HandyKatalog>
<Hersteller name="Nokia">
<Modell name="8210">
<Batterie>900mAh</Batterie>
<Gewicht>141g</Gewicht>
…
</Modell>
</Hersteller>
</HandyKatalog>
<td>Gewicht</td><td>141g</td>
</tr> …
</table>
Java Praktikum – SS 2009 – [email protected]
3
Praktikum aus
Softwareentwicklung 2
Beispiel
Handy Modelle
Element
Kindelement
Start Tag
Elementinhalt
von
<Hersteller>
End Tag
<?xml version="1.0" encoding="UTF-8"?>
<HandyKatalog>
<!-- NOKIA -->
<Hersteller name="NOKIA">
<HerstellerNr nr="h1234"/>
<Modell name="7110">
<Gewicht>141g</Gewicht>
<Preis vertrag="ja">999</Preis>
<Preis vertrag="nein">4999</Preis>
</Modell>
<Modell name="8210">
...
</Modell>
</Hersteller>
</HandyKatalog>
Prolog (optional)
"xml declaration"
Elementwurzel
(root oder
document)
Leeres Element
Text
Attribut
Attributwert
HandyKatalog1.XML
Java Praktikum – SS 2009 – [email protected]
4
Praktikum aus
Softwareentwicklung 2
Datenstrukturen
XML Schema
•
Syntax:
–
Mindestens 1 Tag pro Dokument
–
Exakt 1 Tag als Wurzel
–
Keine Überlappungen bei Tags
–
Jedes Tag muss abgeschlossen
werden
Entities
•
Gültigkeit (validity)
XML Dokument entspricht
Syntax und erfüllt ein Schema
XML Prozessor
XML-Dokument
HandyKatalog1.XML
Modell
Features
Parser
Anwendung
Objekte
Fehler
Schema
XML-Prozessoren lesen/verarbeiten XML Dokumente
–
Nur Syntax Check – nicht-validierende Prozessoren
–
Syntax Check und Validieren – validierende Prozessoren
–
Validieren entspricht einem Type Check
Java Praktikum – SS 2009 – [email protected]
5
Praktikum aus
Softwareentwicklung 2
Merkmale von XML
•
Erweiterbarkeit (Metasprache)
–
•
Tags und Attribute können beliebig neu definiert und benannt werden
Strukturierbarkeit
–
Tags können beliebig komplex geschachtelt werden
–
Inhalt kann auch nicht-strukturierte Teile aufweisen:
Beliebiger Elementinhalt mit:
<![CDATA[...Zeichen, die nicht verarbeitet werden...]]>
•
•
Selbstbeschreibend
–
Tags im XML Dokument beschreiben Struktur und Semantik des Inhalts
–
... für den Menschen: einfach zu lesen u. zu erstellen
–
... für die Maschine: einfach zu generieren u. zu verarbeiten
Validierbarkeit (Typsicherheit)
–
Für XML Dokumente kann optional ein Schema definiert sein (Document Type
Definition - DTD oder XML Schema)
Java Praktikum – SS 2009 – [email protected]
6
Praktikum aus
Softwareentwicklung 2
Syntax
Elemente und Attribute
•
•
Element- und Attributnamen müssen gültige "XML Namen" sein:
–
[ letter | _ | : ] [ letter | '0..9' | '.' | '-' | '_' | ':' ]*
–
letter - Buchstaben A-Z, a-z, sowie Sonderzeichen
–
Verwendung von ':' ist Namensräumen vorbehalten
–
keine Längenbeschränkung
–
Case-sensitiv
Leere Elemente können in Kurzform angeschrieben werden
–
–
•
<HerstellerNr nr="h1234"></HerstellerNr> oder
<HerstellerNr nr="h1234"/>
Attributwerte müssen unter Anführungszeichen gesetzt werden
–
–
<Modell name='8210'> oder
<Modell name="8210">
Java Praktikum – SS 2009 – [email protected]
7
Praktikum aus
Softwareentwicklung 2
Syntax
Kommentare
•
Können sich über mehrere Zeilen erstrecken
–
–
•
zwischen Start Tag und End Tag eines Elements
vor oder nach der Elementwurzel
Restriktionen:
–
–
–
nicht innerhalb eines Tags erlaubt
keine Schachtelung von Kommentaren erlaubt
keine "--" innerhalb eines Kommentars erlaubt
<!-Ein Kommentar darf
auch <tagnamen> oder
&code; enthalten
--> ...
Java Praktikum – SS 2009 – [email protected]
8
Praktikum aus
Softwareentwicklung 2
Java und XML
•
•
•
•
Einführung in XML
–
Merkmale von XML
SAX
–
Grundlagen, Verwendung in Java, …
DOM
–
Grundlagen, Verwendung in Java, …
Validierung
–
DTD, XML Schema
Java Praktikum – SS 2009 – [email protected]
9
Praktikum aus
Softwareentwicklung 2
SAX
Einführung
•
•
•
•
Simple API for XML
API zum Parsen von XML
Unabhängig von der XML Prozessor Implementierung
–
Definiert allgemeines Interface, wie JDBC, Servlet API…
–
Entwickelt von der XML Community
[email protected] Mailing Liste
Verfügbar in Java 6 mit JAXP 1.4
–
–
•
(1/2)
Java API for XML Processing (https://jaxp.dev.java.net/)
javax.org.sax…
javax.xml…
SAX 2.0 (http://www.saxproject.org/about.html)
Java Praktikum – SS 2009 – [email protected]
10
Praktikum aus
Softwareentwicklung 2
SAX
(2/2)
•
SAX ist Ereignis-basiert
•
Callback Interface (Observer Pattern)
•
Benutzer implementiert Callbacks im
Content Handler Objekt
•
SAX Parser ruft je Start Tag, Ende
Tag, etc. ein Callback auf
•
Ereignis wird im Callback von
Anwendung verarbeitet
•
Ausschließlich serieller Zugriff auf
Dokument (streaming)
MyApp
XML
Parser
Java Praktikum – SS 2009 – [email protected]
XML
Infoset
SAX
Einführung
11
Praktikum aus
Softwareentwicklung 2
SAX
Verwendung von SAX in Java
Java Praktikum – SS 2009 – [email protected]
12
Praktikum aus
Softwareentwicklung 2
SAX
Verwendung von SAX in Java
•
Implementierung der Ereignisbehandlung
org.xml.sax.ContentHandler
public void characters(char[] ch, int start, int length);
public void startDocument();
public void endDocument();
public void startElement(String namespaceURI, String localName,
String qName, Attributes atts);
public void endElement(String namespaceURI, String localname,
String qName);
…
public class MySAXEcho extends DefaultHandler {
…
}
Java Praktikum – SS 2009 – [email protected]
13
Praktikum aus
Softwareentwicklung 2
SAX
Verwendung von SAX in Java
•
Parse-Vorgang starten
public static void main(String argv[]) {
if (argv.length != 1) {
System.err.println("Usage: cmd filename");
System.exit(1);
} // Use an instance of ourselves as the SAX event handler
DefaultHandler handler = new MySAXEcho(); // Use the default parser
SAXParserFactory factory = SAXParserFactory.newInstance();
try {
// Set up output stream
out = new OutputStreamWriter(System.out, "UTF8");
// Parse the input SAXParser
saxParser = factory.newSAXParser();
saxParser.parse( new File(argv[0]), handler );
} catch (Throwable t) { t.printStackTrace(); }
System.exit(0);
}
Java Praktikum – SS 2009 – [email protected]
14
Praktikum aus
Softwareentwicklung 2
SAX
Vor- und Nachteile
•
Vorteile
–
–
–
–
•
Für Streaming Anwendungen geeignet
Geringe Speicheranforderungen
Daher auch für sehr große Dokumente geeignet
Performanz
Nachteile
–
–
–
Zugriff ausschließlich seriell möglich
Applikation muss bei verschachtelten Strukturen Stack
selbst aufbauen – unübersichtliche Implementierung
Low-level API: geringe Abstraktion
Java Praktikum – SS 2009 – [email protected]
15
Praktikum aus
Softwareentwicklung 2
SAX
Zusammenfassung
•
SAX ist geeignet, wenn…
–
–
–
–
–
–
Verarbeitungslogik einfach ist
es reicht, das Dokument ein bis zweimal zu durchlaufen
man nur einige Daten braucht
der Kontext der benötigten Daten nicht von besonderem
Interesse ist
Speicher-Restriktionen bestehen
Verarbeitung sehr großer Dokumente erfolgt
Java Praktikum – SS 2009 – [email protected]
16
Praktikum aus
Softwareentwicklung 2
Java und XML
•
•
•
•
Einführung in XML
–
Merkmale von XML
SAX
–
Grundlagen, Verwendung in Java, …
DOM
–
Grundlagen, Verwendung in Java, …
Validierung
–
DTD, XML Schema
Java Praktikum – SS 2009 – [email protected]
17
Praktikum aus
Softwareentwicklung 2
DOM
Charakteristika
•
DOM = Document Object Model
•
Ist plattform- und programmiersprachen-unabhängig
•
Definiert die logische Struktur eines Dokumentes in Form
eines Baumes, bestehend aus Knoten und Kanten
•
Ermöglicht das Lesen, sowie die dynamische Änderung von
Inhalt und Struktur eines XML-Dokuments
•
Entstand aus dem Grundgedanken, die Manipulation von HTML
mittels JavaScript browserunabhängig zu machen
•
Ist ein Standard des W3C (http://www.w3.org/)
Java Praktikum – SS 2009 – [email protected]
18
Praktikum aus
Softwareentwicklung 2
DOM
Unterschiede zwischen DOM und SAX
•
SAX ist ereignis-orientiert
–
–
–
•
Das Dokument muss nicht als Ganzes in den Hauptspeicher
geladen werden
Geeignet für große Dokumente
Direkte Manipulation von XML Dokumenten nicht
möglich
DOM ist document-oriented
–
–
–
–
Das gesamte Dokument wird in den Hauptspeicher geladen
XML Dokument wird als Baumstruktur dargestellt
Dabei wird jede Komponente als Knoten repräsentiert
Baum kann traversiert und verändert werden
Java Praktikum – SS 2009 – [email protected]
19
Praktikum aus
Softwareentwicklung 2
DOM
Klassen Hierarchie
Node
Document
Notation
Text
Element
CharacterData
Comment
Attr
Entity
DocumentType
EntityReference
Processing
Instruction
Document
Fragment
CDATASection
Java Praktikum – SS 2009 – [email protected]
20
Praktikum aus
Softwareentwicklung 2
DOM
Dokument als Baum
<HandyKatalog>
<!-- NOKIA -->
<Hersteller name="NOKIA">
<HerstellerNr nr="h1234"/>
<Modell name="7110">
<Gewicht>141g</Gewicht>
<Preis vertrag="ja">999</Preis>
<Preis vertrag="nein">4999</Preis>
</Modell>
</Hersteller>
</HandyKatalog>
HerstellerNr:
Gewicht:
Element
141g:Text
Preis:
Element
999:Text
Element
nr:Attribute
handycat.xml:
Document
NOKIA:Comment
HandyKatalog:
Element
Hersteller:Elemen
t
name:Attribute
h1234:Text
Preis:
Element
Modell:
Element
name:Attribute
vertrag:Attribute
7110:Text
ja:Text
999:Text
vertrag:Attribut
e
nein:Text
NOKIA:Text
Java Praktikum – SS 2009 – [email protected]
21
Praktikum aus
Softwareentwicklung 2
DOM
Baum traversieren
firstChild
NOKIA:Text
getAttributeNode("name")
name:Attr
hersteller:Element
firstChild
<hersteller name="NOKIA">
<modell name="8210">
<batterie>900mAh</batterie>
<gewicht>141g</gewicht>
</modell>
</hersteller>
getAttributeNode("name")
modell:Element
name:Attr
firstChild
firstChild
lastChild
8210:Text
nextSibling
batterie:Element
firstChild
900mAh:Text
Java Praktikum – SS 2009 – [email protected]
gewicht:Element
firstChild
141g:Text
22
Praktikum aus
Softwareentwicklung 2
DOM
Verwendung von DOM in Java
•
Wesentliche Java-Packages
import
import
import
import
javax.xml.parsers.DocumentBuilder;
javax.xml.parsers.DocumentBuilderFactory;
javax.xml.parsers.FactoryConfigurationError;
javax.xml.parsers.ParserConfigurationException;
import org.xml.sax.SAXException;
import org.xml.sax.SAXParseException;
import org.w3c.dom.Document;
import org.w3c.dom.DOMException;
Java Praktikum – SS 2009 – [email protected]
23
Praktikum aus
Softwareentwicklung 2
DOM
Verwendung von DOM in Java
•
Parse-Vorgang starten
public static void main(String argv[]) {
if (argv.length != 1) { ... }
DocumentBuilderFactory factory =
DocumentBuilderFactory.newInstance();
try {
// Get a Parser and Parse the File
DocumentBuilder builder = factory.newDocumentBuilder();
document = builder.parse( new File(argv[0]) );
} catch (SAXParseException spe) {
…
Java Praktikum – SS 2009 – [email protected]
24
Praktikum aus
Softwareentwicklung 2
DOM
Verwendung von DOM in Java
•
Zentrales Objekt: org.w3c.dom.Node
…
Node getFirstChild();
Node getLastChild();
NodeList getChildNodes();
NamedNodeMap getAttributes();
String getNodeName();
short getNodeType();
Document getOwnerDocument();
Node getParentNode();
Node getPreviousSibling();
Node getNextSivling();
boolean hasAttributes();
boolean hasChildNodes();
Node insertBefore(Node newChild, Node refChild);
Node removeChild(Node oldChild);
void setNodeValue(String value);
Java Praktikum – SS 2009 – [email protected]
25
Praktikum aus
Softwareentwicklung 2
DOM
Verwendung von DOM in Java
•
Beispiel:
// Zugriff auf Wurzelelement
Element rootElem = document.getDocumentElement();
if (rootElem.hasChildNodes()) {
NodeList childNodes = rootElem.getChildNodes();
for (int i=0; i<childNodes.getLength; i++) {
System.out.println(childNodes.item(i).getNodeName());
if (childNodes.item(i).getNodeType() == Node.TEXT_NODE)
System.out.println(childNodes.item(i).getNodeValue();
}
}
…
Java Praktikum – SS 2009 – [email protected]
26
Praktikum aus
Softwareentwicklung 2
DOM
Dokument generieren
•
Neue Elemente erzeugen mit Methoden von
org.w3c.Document
Attr createAttribute(String name);
CDATASection createCDATASection(String data);
Comment createComment(String data);
Element createElement(String tagName);
Text createTextNode(String data);
Element getDocumentElement();
Element getElementById(String elementID);
NodeList getElementsByTagName(String tagName);
Java Praktikum – SS 2009 – [email protected]
27
Praktikum aus
Softwareentwicklung 2
DOM
Dokument generieren
•
Beispiel: Element erzeugen
Element newElem = document.createElement("Handy");
Attr newAttribute = document.createAttribute("type");
newAttribute.setValue("Siemens S55");
newElem.setAttributeNode(newAttribute);
rootElem.appendChild(newElem);
Java Praktikum – SS 2009 – [email protected]
28
Praktikum aus
Softwareentwicklung 2
DOM
Dokument speichern
import javax.xml.transform.Transformer;
…
FileOutputStream os = null;
try {
os = new FileOutputStream(output);
// Use a Transformer for output
TransformerFactory tFactory = TransformerFactory.newInstance();
Transformer transformer = tFactory.newTransformer();
transformer.setOutputProperty(
OutputKeys.DOCTYPE_SYSTEM, <DTD>);
DOMSource source = new DOMSource(document);
StreamResult result = new StreamResult(os);
transformer.transform(source, result);
} catch (<Exceptions>) {
}
Java Praktikum – SS 2009 – [email protected]
29
Praktikum aus
Softwareentwicklung 2
DOM
Vor- und Nachteile
•
•
Vorteile
–
W3C Standard von vielen Parsern implementiert
–
Einfache Verarbeitung von XML Dokumenten
–
Bietet auch die Möglichkeit XML Dokumente wahlfrei zu
manipulieren (vs. SAX - nur seriell)
Nachteile
–
Hoher Speicherbedarf bei großen XML Dokumenten
–
Hohe Geschwindigkeitsverluste bei großen XML Dokumenten
–
Nicht für Streaming geeignet; Traversieren erst möglich, wenn
XML Dokument vollständig geladen
(MS XML Parser verwendet als Abhilfe standardmäßig asynchrones Parsen)
Java Praktikum – SS 2009 – [email protected]
30
Praktikum aus
Softwareentwicklung 2
Java und XML
•
•
•
•
Einführung in XML
–
Merkmale von XML
SAX
–
Grundlagen, Verwendung in Java, …
DOM
–
Grundlagen, Verwendung in Java, …
Validierung
–
XML Schema
Java Praktikum – SS 2009 – [email protected]
31
Praktikum aus
Softwareentwicklung 2
Validierung
Type Check
•
„Wohlgeformtheit“ von XML
Dokumenten
–
•
Validität
–
–
•
Einhaltung syntaktischer Regeln
Struktur
Erlaubte Datentypen
XML Schema
–
Beschreibt Dokumentstruktur
Java Praktikum – SS 2009 – [email protected]
32
Praktikum aus
Softwareentwicklung 2
XML Schema
•
XSD – XML Schema Defintion
–
•
XML-basiert
–
•
Dateiendung.xsd
Parsen, Suchen, Generatoren…
XMI – XML Metadata Interchange
–
OMG Standard
http://www.omg.org/technology/documents/formal/xmi.htm
–
Zur Beschreibung von Meta-Modellen
• UML, MOF (Meta-Object Facility)
–
Austauschformat von Objekten zwischen Tools
• EMF (Eclipse Modeling Framework)
Java Praktikum – SS 2009 – [email protected]
33
Praktikum aus
Softwareentwicklung 2
XML Schema
Datentypen
•
Text
–
•
Zahlen
–
–
–
•
string
decimal
integer
float
Datum
–
date
Java Praktikum – SS 2009 – [email protected]
34
Praktikum aus
Softwareentwicklung 2
XML Schema
Einfache Typen
•
•
•
Keine XML Kindelemente
Keine Attribute
Einschränkungen (Constraints)
–
•
Aufzählungen
–
•
restriction
enumeration
Kombination von verschiedenen Typen
–
union
Java Praktikum – SS 2009 – [email protected]
35
Praktikum aus
Softwareentwicklung 2
XML Schema
Komplexe Typen
•
•
•
•
Liste von Kindelementen
–
sequence
–
Jedes Element kann 0 oder mehrfach auftreten
–
Reihenfolge muss eingehalten werden
Liste von Alternativen
–
choice
–
Es darf nur 1 Element auftreten
Liste einzelner Elemente
–
all
–
Jedes Element darf nur 0 oder 1 mal auftreten
Ableitung
–
extension / restriction
Java Praktikum – SS 2009 – [email protected]
36
Praktikum aus
Softwareentwicklung 2
XML Schema
JAXB
●
●
XML to Java Binding
●
Java API aus XML Schema generieren
●
Lesen und Schreiben von XML
●
Type Sicherheit
xjc – XML Binding Compiler
●
Java SDK Tool, siehe JAVA_HOME/bin
●
Generiert Java Klassen aus XML Schema
Java Praktikum – SS 2009 – [email protected]
37
Praktikum aus
Softwareentwicklung 2
Ende der 7. Übung
Java Praktikum – SS 2009 – [email protected]
38
Herunterladen