Java und XML

Werbung
Praktikum aus
Softwareentwicklung 2
Java und XML
Praktikum aus Softwareentwicklung 2
Java Praktikum – SS 2010 – [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
–
XML Schema, JAXB
Java Praktikum – SS 2010 – [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 2010 – [email protected]
3
Praktikum aus
Softwareentwicklung 2
Beispiel
Handy Modelle
Element
Kindelement
Start Tag
Content
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
Content
Attribut
Attributwert
HandyKatalog1.XML
Java Praktikum – SS 2010 – [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 2010 – [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 2010 – [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 2010 – [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 2010 – [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
–
XML Schema, JAXB
Java Praktikum – SS 2010 – [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 2010 – [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 2010 – [email protected]
XML
Infoset
SAX
Einführung
11
Praktikum aus
Softwareentwicklung 2
SAX
Verwendung von SAX in Java
Java Praktikum – SS 2010 – [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 2010 – [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 2010 – [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 2010 – [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
Speicher-Restriktionen bestehen
Verarbeitung sehr großer Dokumente erfolgt
Java Praktikum – SS 2010 – [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
–
XML Schema, JAXB
Java Praktikum – SS 2010 – [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 2010 – [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
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 werden
Manipulation von XML Dokumenten ist möglich
Java Praktikum – SS 2010 – [email protected]
19
Praktikum aus
Softwareentwicklung 2
DOM
Klassen Hierarchie
org.w3c.dom
Node
Document
Notation
Text
Element
CharacterData
Comment
Attr
Entity
DocumentType
EntityReference
Processing
Instruction
Document
Fragment
CDATASection
Java Praktikum – SS 2010 – [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 2010 – [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 2010 – [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 2010 – [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 2010 – [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 appendChild(Node child);
Node insertBefore(Node newChild, Node refChild);
Node removeChild(Node oldChild);
void setNodeValue(String value);
Java Praktikum – SS 2010 – [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 2010 – [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 2010 – [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 2010 – [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 2010 – [email protected]
29
Praktikum aus
Softwareentwicklung 2
DOM
Vor- und Nachteile
•
•
Vorteile
–
W3C Standard API, 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 2010 – [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, JAXB
Java Praktikum – SS 2010 – [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
Erhält Konsistenz
Nur eine Schema Definition pro Dokument
Java Praktikum – SS 2010 – [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 2010 – [email protected]
33
Praktikum aus
Softwareentwicklung 2
XML Schema
Datentypen
•
Text
–
string
•
Zahlen
–
decimal
–
integer
–
float
•
Datum
–
date
–
time
boolean
list
•
•
Java Praktikum – SS 2010 – [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 2010 – [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 2010 – [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 2010 – [email protected]
37
Praktikum aus
Softwareentwicklung 2
Ende der 7. Übung
Java Praktikum – SS 2010 – [email protected]
38
Herunterladen