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