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