Die Präsentation wird geladen. Bitte warten

Die Präsentation wird geladen. Bitte warten

XML und Java Verarbeitung von XML-Dokumenten mit JAVA.

Ähnliche Präsentationen


Präsentation zum Thema: "XML und Java Verarbeitung von XML-Dokumenten mit JAVA."—  Präsentation transkript:

1 XML und Java Verarbeitung von XML-Dokumenten mit JAVA

2 © Was ist zu tun ? Erzeugen von XML-Dokumenten einfach System.out.println(" "); System.out.println(" "); Logik steckt in Applikation Erzeugen der XML-Dokumente durch normale JAVA-IO Einlesen von XML ? manuell (Parser selbst schreiben) möglich (natürlich) aufwendig (insb. Validierung) fertigen Parser nehmen viele verschiedene (IBM, Microsoft, Apache,...) aber: Standard APIs --> austauschbar SAX und DOM (und JDOM ?)

3 © Warum verschiedene ? Warum nicht alles mit XSLT/DOM ? K:\JavaKurs\012 XML und Java>java Transform manycontacts.xml contact.xsl out.dat Dauer: 8922 ms K:\JavaKurs\012 XML und Java>java DOMTransform manycontacts.xml Dauer: 3445 ms K:\JavaKurs\012 XML und Java>java SAX2Transform manycontacts.xml Dauer: 2173 ms Unterschied im Speicherbedarf ist beinahe noch dramatischer: ca. 8 MB für SAX ca. 25 MB für DOM/XSLT Je nach Anwendung sollte/muß die passende Methode verwendet werden !

4 © SAX Simple API for XML kein offizieller (W3C,...) Standard aber weitverbreitet einfach schnell flexibel "Minimal-Parser" Event gesteuert Für verschiedene Elemente (Tag, Daten, Processing- Instruction,...) eines XML-Dokuments werden Events ausgelöst, die behandelt werden können

5 © SAX Prinzip XML- Dokument SAX Parser An- wendung Dokumen t Anfang Tag- Anfang Daten

6 © Verwendung SAX definiert Interfaces DocumentHandler EntityResolver DTDHandler ErrorHandler die vom Anwender implementiert werden SAX Version 2 (aktuell) liefert DefaultHandler, der erweitert wird damit nicht die vollst. Interfaces implementiert werden müssen, auch, wenn sie gar nicht von Interesse sind

7 © ContentHandler

8 © Ablauf der Events Zunächst startDocument kann überschrieben werden, meist nicht nötig Für jedes Tag wird startElement (mit Name des Elements und Attributen), dann typ. ein oder mehrmals characters (mit dem Text) und schließlich endElement (mit dem Namen des Elements) aufgerufen Verarbeitung je nachdem, typ. entweder Aufbau von Objekten, die den Elementen entsprechen oder Elementweise Bearbeitung

9 © Verwendung import javax.xml.parsers.*; import org.xml.sax.*; import org.xml.sax.ext.*; import org.xml.sax.helpers.*; public class SAX2Test extends DefaultHandler { public void startElement(String uri, String local, String raw, Attributes attrs) { out.println(local); } public void characters(char ch[], int start, int length) { String s = new String(ch,start,length); out.println(s); } public void endElement(String uri, String local, String qName) throws SAXException { out.println("End " + local); }...

10 © Wo kommt der Parser her ? // Dieser Teil ist eigentlich bei jeder Applikation gleich SAX2Test myContentHandler = new SAX2Test(); XMLReader parser = new org.apache.xerces.parsers.SAXParser(); parser.setFeature( "http://xml.org/sax/features/validation", true); parser.setFeature( "http://xml.org/sax/features/namespaces", true); parser.setContentHandler(myContentHandler); parser.setErrorHandler(myContentHandler); parser.parse(args[0]); // oder moderner/flexibler mit SAXParserFactory InputSource insource = new InputSource(new FileInputStream(Filename)); SAXParserFactory factory = SAXParserFactory.newInstance(); factory.setValidating(true); factory.setNamespaceAware(true); SAXParser parser = factory.newSAXParser(); XMLReader xmlReader = parser.getXMLReader(); xmlReader.parse(insource);

11 © Arbeiten mit XML-Objekten Annahme: Informationen über Objekte (z.B. Artikel) in XML-Datei sollen in Anwendung bearbeitet werden wie ? Abbildung auf Java Objekte Kolbenrueckholfeder Kurbelwellenbeleuchtung... public class ArtikelListe { private Vector A; } public class Artikel { private String ID; private String Beschreibung; }

12 © Beispiel: Artikel public class ArtikelParser extends DefaultHandler { private ArtikelListe Liste; private Artikel A; private String buf; public void startElement(String uri, String local, String raw, Attributes attrs) { if (local.equals("ArtikelListe")) Liste = new ArtikelListe(); if (local.equals("Artikel")) { buf = new String(); String ID = attrs.getValue(0); // Hat nur ein Attribut - ID A = new Artikel(ID); } public void characters(char ch[], int start, int length) { buf+=new String(ch,start,length); } public void endElement(String uri, String local, String qName) { if (local.equals("Artikel")) { A.setBeschreibung(buf); Liste.add(A); }

13 © Artikel contd. Hier ziemlich einfache ("flache") Struktur Artikel enthält keine weiteren Elemente,... Gleiches Verfahren auch bei tieferen Hierarchien möglich z.B. Artikel kann Elemente 99 enthalten public class Artikel { private Vector Preise;... } public class Preis { private int Menge; private int Einzelpreis;... } Problem: Die Preis-Objekte müssen zuerst angelegt und zwischengespeichert, bevor das Artikel-Objekt fertig ist Lösung: Stack,...

14 © Generische Lösung Warum immer wieder von Hand programmieren ? public class Node { private String Name; private String Value; private HashTable attrs; private Vector Children; }... public void startElement(String uri, String local, String raw, Attributes attrs) { ElementStack.push(ActualNode); Node aNode = new Node; aNode.setName(local); aNode.setAttributes(attrs); ActualNode = aNode } public void endElement(String uri, String local, String qName) { ElementStack.top().addChild(ActualNode); ActualNode = ElementStack.pop(); } kann beliebige Objekthierarchien abbilden

15 © DOM Bildet XML-Dokument als Objekthierarchie ab Element Text CData

16 © DOM Objektmodell Alles ist ein Node (Basisklasse) abgeleitet Document Element Attribute CharacterData usw. Node hat Methoden getNodeName() getNodeValue() getAttributes() getChildNodes()...

17 © DOM contd. Abgeleitete Klassen/Interfaces haben entsprechende Attribute/Methoden z.B. Element getTagName() getAttribute(String Name) getElementsByTagName(String Name) Document getDocType() DTD getDocumentElement() Root Element des Dokuments

18 © Verwendung Flexibilität wird (auch hier) durch (etwas) Umständlichkeit erkauft ;-) DOMParser parser = new DOMParser(); parser.parse("contacts.xml"); Document document = parser.getDocument(); Element root = document.getDocumentElement(); NodeList L = root.getElementsByTagName("Artikel"); for(int i=0; i

19 © DOM kann aber mehr ! DOM kann auch modifizieren Document Objekt hat Methode create(String TagName) ! Element e = document.createElement("Artikel"); e.setAttribute("ID","1234"); e.appendChild(document.createTextNode("bla bla bla")); root.appendChild(e); Ausgabe mit XMLSerializer OutputFormat format = new OutputFormat( document ); StringWriter stringOut = new StringWriter(); XMLSerializer serial = new XMLSerializer( stringOut, format ); serial.asDOMSerializer(); serial.serialize( document.getDocumentElement() ); DOM kann viel mehr als SAX, ist aber etwas unübersichtlicher

20 © Vergleich SAX/DOM DOM bequem sehr bequem, wenn DOM Objektmodell paßt langsam hoher Speicherbedarf SAX schnell Objektmodell wird durch Anwender erstellt schlecht, weil zus. Aufwand u.U. gut, wenn DOM Modell nicht paßt Eingriffe in die Validierung möglich z.B. eigene (zusätzliche) Validierung möglich Fehlerstelle (Zeile, Spalte,...) bekannt


Herunterladen ppt "XML und Java Verarbeitung von XML-Dokumenten mit JAVA."

Ähnliche Präsentationen


Google-Anzeigen