XML in Java XML Datei Zugriff mit Java

  • Slides: 28
Download presentation
XML in Java XML - Datei Zugriff mit Java Schnaiter <? xml? >

XML in Java XML - Datei Zugriff mit Java Schnaiter <? xml? >

XML in Java <? xml? > Inhalte Ø Ø Ø Ø XML-Dateien für Experimente

XML in Java <? xml? > Inhalte Ø Ø Ø Ø XML-Dateien für Experimente SAX (Simple API fort XML) STAX (Streaming API fort XML) Übung: SAX - STAX DOM JDOM und XPath Exkurs: DAO-Pattern Übung: DAO-Pattern gelöst mit JDOM und XPath Schnaiter

XML-Datei für Experimente <? xml? > <? xml version="1. 0" encoding="UTF-8"? > <party datum="31.

XML-Datei für Experimente <? xml? > <? xml version="1. 0" encoding="UTF-8"? > <party datum="31. 12. 13"> <gast name="Albert Angsthase"> <getraenk>Wein</getraenk> <getraenk>Bier</getraenk> <zustand ledig="true" nuechtern="false"/> </gast> <gast name="Martina Mutig"> <getraenk>Apfelsaft</getraenk> <zustand ledig="true" nuechtern="true"/> </gast> <gast name="Zacharias Zottelig"> </gast> </party> party. xml Schnaiter

<? xml? > XML-Datei für Experimente <? xml version="1. 0" encoding="UTF-8"? > <employees> <employee

<? xml? > XML-Datei für Experimente <? xml version="1. 0" encoding="UTF-8"? > <employees> <employee id="1"> <age>29</age> <name>Pankaj</name> <gender>Male</gender> <role>Java Developer</role> </employee> <employee id="2"> <age>35</age> <name>Lisa</name> <gender>Female</gender> <role>CEO</role> </employees> employees. xml …. Schnaiter

SAX (Simple API for XML) <? xml? > Ansatz Ø Sequentielle Abarbeitung des Dokuments

SAX (Simple API for XML) <? xml? > Ansatz Ø Sequentielle Abarbeitung des Dokuments Der Parse-Baum wird nicht aufgebaut. kaum Speicher wird verbraucht. Ø SAX kann auch sehr große Dokumente parsen. Ø Event-basiertes Framework. Während der Parser das File analysiert, ruft dieser die vom Anwendungsentwickler implementierten Callback-Methoden auf. Schnaiter

SAX (Simple API for XML) <? xml? > Beispiel: Mitarbeiterverwaltung mit SAX package fachklassen;

SAX (Simple API for XML) <? xml? > Beispiel: Mitarbeiterverwaltung mit SAX package fachklassen; public class Mitarbeiter { private private int id; String name; String geschlecht; int alter; String funktion; mitarbeiter. java // Konstruktoren Default und mit allen Attributen als Parameter // diverse setter und getter @Override public String to. String() { return "Mitarbeiter: ID="+this. id+" Name=" + this. name + " Alter=" + this. alter + " Geschlecht=" + this. geschlecht + " Funktion=" + this. funktion; } } Schnaiter

SAX (Simple API for XML) <? xml? > Beispiel: Mitarbeiterverwaltung mit SAX public class

SAX (Simple API for XML) <? xml? > Beispiel: Mitarbeiterverwaltung mit SAX public class Mitarbeiter. Sax. Parser { public static void main(String[] args) throws Exception { SAXParser. Factory parser. Factory = SAXParser. Factory. new. Instance(); SAXParser sax. Parser = parser. Factory. new. SAXParser(); SAXHandler handler = new SAXHandler(); sax. Parser. parse(new File("employees. xml"), handler); // sax. Parser. parse(Class. Loader. get. System. Resource. As. Stream( "xml/employees. xml"), handler); } } Ø SAXParser und SAXParser. Factory befinden sich im Paket java. xml. parsers Ø Der SAXParser wird per Factory erzeugt und ist der eigentliche Parser. Er verfügt über die wichtige Methode parse(). Während die XML-Datei geladen und durchgegangen wird, werden die Methoden des SAXHandlers aufgerufen. Schnaiter

<? xml? > SAX (Simple API for XML) Beispiel: Mitarbeiterverwaltung mit SAX class SAXHandler

<? xml? > SAX (Simple API for XML) Beispiel: Mitarbeiterverwaltung mit SAX class SAXHandler extends Default. Handler { private List<Mitarbeiter> emp. List = null; private Mitarbeiter curr. Emp = null; private String content = null; // Arrayliste für alle Mitarbeiter // aktuell gelesener Mitarbeiter // für den Textinhalt von Elementknoten @Override public void start. Document() throws SAXException { // wird vom Parser zu Beginn des Lesens aufgerufen } @Override public void end. Document() throws SAXException { // Ende des Dokuments wurde erreicht // Mitarbeiterliste aus der XML-Datei ausgeben for (Mitarbeiter emp : emp. List) { System. out. println(emp); } } Schnaiter

SAX (Simple API for XML) <? xml? > Beispiel: Mitarbeiterverwaltung mit SAX @Override //

SAX (Simple API for XML) <? xml? > Beispiel: Mitarbeiterverwaltung mit SAX @Override // Wird aufgerufen bei jedem Start-Tag // wichtige Parameter: der Elementname und seine Attribute public void start. Element(String uri, String local. Name, String element. Name, Attributes attributes) throws SAXException { if (element. Name. equals("employees")) { // alle Mitarbeitern werden emp. List = new Array. List<>(); // unterhalb von employees verwaltet } else if (element. Name. equals("employee")) { curr. Emp = new Mitarbeiter(); // neuer Mitarbeiter in der XML-Datei curr. Emp. set. Id(Integer. parse. Int(attributes. get. Value("id"))); } // id kann als Attribut gelesen werden } @Override public void characters(char[] ch, int start, int length) throws SAXException { // Die Inhalte zwischen Start-Tag und Ende-Tag auslesen content = String. copy. Value. Of(ch, start, length). trim(); } Schnaiter

SAX (Simple API for XML) <? xml? > Beispiel: Mitarbeiterverwaltung mit SAX @Override public

SAX (Simple API for XML) <? xml? > Beispiel: Mitarbeiterverwaltung mit SAX @Override public void end. Element(String uri, String local. Name, String element. Name) throws SAXException { if (element. Name. equals("employee")) { // Füge den neuen Mitarbeiter zur Liste hinzu emp. List. add(curr. Emp); // Alle anderen Tags dienen zum Setzen der Attribute } else if (element. Name. equals("age")) { curr. Emp. set. Alter(Integer. parse. Int(content)); } else if (element. Name. equals("name")) { curr. Emp. set. Name(content); } else if (element. Name. equals("gender")) { curr. Emp. set. Geschlecht(content); } else if (element. Name. equals("role")) { curr. Emp. set. Role(content); } } } Schnaiter

SAX (Simple API for XML) <? xml? > Wichtiges zum Default. Handler Ø befindet

SAX (Simple API for XML) <? xml? > Wichtiges zum Default. Handler Ø befindet sich im Paket java. xml. sax. helpers Ø Implementiert vier verschiedene Handler-Interfaces Entity. Resolver, DTDHandler, Content. Handler, Error. Handler Ø Alle Methoden zu den Interfaces werden in der Klasse Default. Handler als leere Methoden { } angeboten. Ø Die wichtigsten Methoden zum Parsen des Dokuments werden durch das Interface Content. Handler deklariert. z. B start. Document(), end. Document(), start. Element(. . . ), end. Element(. . . ), characters(…) Ø Der „eigene“ SAXHandler erbt vom Default. Handler und überschreibt die relevanten Methoden sinnvoll. Schnaiter

STAX (Streaming API for XML ) <? xml? > Ansatz Ø Sehr effizienter Zugriff

STAX (Streaming API for XML ) <? xml? > Ansatz Ø Sehr effizienter Zugriff da auch hier der XML-Baum nicht im Speicher hinterlegt wird. Vor allem mit der Cursor-API Ø Bietet API zum Lesen und Schreiben Ø Der STAX-Parser muss aktiv von Komponente zu Komponente bewegt werden (pull-Style). Ø Bei der Cursor-Verarbeitung wird die Komponente direkt mit dem Parser verarbeitet. Dies sind z. B. START_ELEMENT, CHARACTERS, END_ELEMENT, START_DOCUMENT, END_DOCUMENT Ø Beim Iterator Zugriff werden XML-Event-Objekte geliefert. Ø XMLInput. Factory, XMLStream. Constants, XMLStream. Exception und XMLStream. Reader befinden sich im Package javax. xml. stream Schnaiter

STAX (Streaming API for XML) <? xml? > Beispiel: Mitarbeiterverwaltung mit STAX public class

STAX (Streaming API for XML) <? xml? > Beispiel: Mitarbeiterverwaltung mit STAX public class Mitarbeiter. Stax. Parser { public static void main(String[] args) throws XMLStream. Exception, File. Not. Found. Exception { List<Mitarbeiter> emp. List = null; // Arrayliste für alle Mitarbeiter curr. Emp = null; // aktuell gelesener Mitarbeiter String content = null; // für den Textinhalt von Elementknoten String element. Name; // für den Element-Namen XMLInput. Factory xml. Input. Factory = XMLInput. Factory. new. Instance(); XMLStream. Reader xml. Stream. Reader = xml. Input. Factory. create. XMLStream. Reader( new File. Input. Stream("employees. xml")); Ø Erzeuge den passenden XML-Parser mit der XMLInput. Factory. Wähle XMLStream. Reader für die Cursor-Verarbeitung oder XMLEvent. Reader für die Iterator-Verarbeitung Schnaiter

STAX (Streaming API for XML) <? xml? > Beispiel: Mitarbeiterverwaltung mit STAX while (xml.

STAX (Streaming API for XML) <? xml? > Beispiel: Mitarbeiterverwaltung mit STAX while (xml. Stream. Reader. has. Next()) { int event = xml. Stream. Reader. next(); switch (event) { case XMLStream. Constants. START_ELEMENT: element. Name = xml. Stream. Reader. get. Local. Name(); if (element. Name. equals("employees")) { emp. List = new Array. List<>(); } else if (element. Name. equals("employee")) { curr. Emp = new Mitarbeiter(); curr. Emp. set. Id(Integer. parse. Int( xml. Stream. Reader. get. Attribute. Value(0))); } break; case XMLStream. Constants. CHARACTERS: content = xml. Stream. Reader. get. Text(). trim(); break; Schnaiter

STAX (Streaming API for XML) <? xml? > Beispiel: Mitarbeiterverwaltung mit STAX case XMLStream.

STAX (Streaming API for XML) <? xml? > Beispiel: Mitarbeiterverwaltung mit STAX case XMLStream. Constants. END_ELEMENT: element. Name = xml. Stream. Reader. get. Local. Name(); if (element. Name. equals("employee")) { // Füge den neuen Mitarbeiter zur Liste hinzu emp. List. add(curr. Emp); // Alle anderen Tags dienen zum Setzen der Attribute } else if (element. Name. equals("age")) { curr. Emp. set. Alter(Integer. parse. Int(content)); } else if (element. Name. equals("name")) { curr. Emp. set. Name(content); } else if (element. Name. equals("gender")) { curr. Emp. set. Geschlecht(content); } else if (element. Name. equals("role")) { curr. Emp. set. Role(content); } break; Schnaiter

STAX (Streaming API for XML) <? xml? > Beispiel: Mitarbeiterverwaltung mit STAX case XMLStream.

STAX (Streaming API for XML) <? xml? > Beispiel: Mitarbeiterverwaltung mit STAX case XMLStream. Constants. START_DOCUMENT: // break; case XMLStream. Constants. END_DOCUMENT: // Daten von allen Mitarbeitern ausgeben for (Mitarbeiter emp : emp. List) { System. out. println(emp); } break; } } Schnaiter

Übung zu SAX - STAX <? xml? > Ø Greifen Sie auf die XML-Datei

Übung zu SAX - STAX <? xml? > Ø Greifen Sie auf die XML-Datei party. xml per SAX oder STAX zu. Ø Geben Sie alle relevanten Daten aus. Mögliche Bildschirmausgabe: Datum der Party: 31. 12. 01 Neuer Gast: Albert Angsthase trinkt: Wein trinkt: Bier ist ledig: true und nuechtern: false Neuer Gast: Martina Mutig trinkt: Apfelsaft ist ledig: true und nuechtern: true Neuer Gast: Zacharias Zottelig Schnaiter

DOM (Document Object Model) <? xml? > Ansatz Ø Erstellung eines baumförmigen Modells der

DOM (Document Object Model) <? xml? > Ansatz Ø Erstellung eines baumförmigen Modells der Dokumentstruktur (XML oder HTML) Ø Auswertung und Manipulation dieser Struktur über Methoden der Objekte im Baum Ø Sammlung von Klassen („Interfaces“), die im Baum verwendet werden Schnaiter

DOM (Document Object Model) <? xml? > Vorteile Ø Ø einheitlicher Zugriff in verschiedenen

DOM (Document Object Model) <? xml? > Vorteile Ø Ø einheitlicher Zugriff in verschiedenen Sprachen gezielter und schneller Zugriff geringerer Programmieraufwand als bei SAX besser geeignet zur Generierung dynamischer Inhalte Nachteile Ø Ø zunächst hoher Overhead für die Baumerstellung automatisches Durchschreiten des Baumes nicht enthalten konsequente Baumorientierung umständlich Schreiben von XML nicht enthalten Schnaiter

DOM (Document Object Model) Beispiel Schnaiter <? xml? >

DOM (Document Object Model) Beispiel Schnaiter <? xml? >

JDOM (Java Document Object Model) <? xml? > Ø Open-Source API Ø speziell auf

JDOM (Java Document Object Model) <? xml? > Ø Open-Source API Ø speziell auf Java zugeschnittenes Objekt-Modell für XML vereint die Stärken von SAX und DOM Ø Schreiben von XML möglich Ø XML-Dokument wird vollständig im Speicher abgebildet Hohe Anforderung an Ressourcen Schnaiter

JDOM (Java Document Object Model) <? xml? > Ø kann auf vorhandenen SAX und

JDOM (Java Document Object Model) <? xml? > Ø kann auf vorhandenen SAX und DOM Parsern aufsetzen Ø SAXBuilder builder = new SAXBuilder(); Ø Document doc = builder. build(new File. Input. Stream("dvdsammlung. xml")); Ø Es werden Klassen bereitgestellt, nicht nur Interfaces. Element titel. El = new Element("titel"); Ø Textinhalt kann Elementen direkt zugewiesen werden. titel. El. set. Text("Kühles Bier"); Ø Es werden Standard-Java-Collection-Klassen benutzt java. util. List atts = elem. get. Attributes(); Schnaiter

XPATH mit Java <? xml? > Ø XPATH-Fabrik per Singleton-Pattern erzeugen XPath. Factory xpf

XPATH mit Java <? xml? > Ø XPATH-Fabrik per Singleton-Pattern erzeugen XPath. Factory xpf = XPath. Factory. instance(); Ø XPATH-Ausdruck zum Suchen von Elementen erzeugen XPath. Expression<Element> x. Path = xpf. compile("//getraenk", Filters. element()); Ø Funktioniert auch mit Attributen: Filters. attribute() Ø XPATH-Ausdruck auf JDOM 2. x Dokumente anwenden List<Element> getraenke = x. Path. evaluate(xml. Document); Ø veralteter XPATH-Zugriff mittels JDOM 1. x XPath xp= XPath. new. Instance("//getraenk"); List<Element> getraenke = xp. select. Nodes(xml. Document); Schnaiter

Speichern in XML-Dateien <? xml? > Ø Das Ganze XML-Dokument soll in einer Datei

Speichern in XML-Dateien <? xml? > Ø Das Ganze XML-Dokument soll in einer Datei gespeichert werden. Hierzu dient die Klasse XMLOutputter aus jdom 2. outputter XMLOutputter outp = new XMLOutputter(); Ø Die Ausgabe soll schön formatiert erfolgen outp. set. Format(Format. get. Pretty. Format()); Ø Es geht auch ohne Formatierung: Format. ger. Raw. Format() Ø Formatierte Ausgabe auf der Konsole output(xml. Document, System. out); Ø Formatierte Ausgabe in eine Datei output(xml. Document, new File. Output. Stream(new File("party. xml"))); Schnaiter

Exkurs: DAO-Pattern <? xml? > Ø Data Access Object (DAO, englisch für Datenzugriffsobjekt) ist

Exkurs: DAO-Pattern <? xml? > Ø Data Access Object (DAO, englisch für Datenzugriffsobjekt) ist ein Entwurfsmuster, das den Zugriff auf unterschiedliche Arten von Datenquellen (z. B. Datenbanken, Dateisystem, etc. ) so kapselt, dass die angesprochene Datenquelle ausgetauscht werden kann, ohne dass der aufrufende Code geändert werden muss. Dadurch soll die eigentliche Programmlogik von technischen Details der Datenspeicherung befreit werden und flexibler einsetzbar sein. (Quelle: Wikipedia) Ø Über ein Data Access Object Interface werden Standard Operation definiert, die alle realen Implementierungen mitbringen müssen. Ø Hierdurch ist ein vereinheitlichter Zugriff auf eine My. Sql und andere SQLDatenbanken, eine CSV-Datei, eine Objektorientierte Datenbank, eine JSON -Datei, eine XML-Datei … möglich. Ø Nur geringe Änderungen am Quellcode bei der Umstellung auf eine andere (persistente) Speicherung erforderlich. Schnaiter

Exkurs: DAO-Pattern <? xml? > Mitarbeiterverwaltung mit DAO-Pattern Schnaiter

Exkurs: DAO-Pattern <? xml? > Mitarbeiterverwaltung mit DAO-Pattern Schnaiter

Exkurs: DAO-Pattern <? xml? > public class Test. Mitarbeiter. DAO { public static void

Exkurs: DAO-Pattern <? xml? > public class Test. Mitarbeiter. DAO { public static void main(String[] args) { try { // Mitarbeiterverwaltung in My. Sql-DB oder in XML-Datei // IMitarbeiter. DAO mitarbeiter. DAO = new My. Sql. Mitarbeiter. DAO(); IMitarbeiter. DAO mitarbeiter. DAO = new Xml. Mitarbeiter. DAO(); Mitarbeiter lisa = mitarbeiter. DAO. get. Mitarbeiter(2); lisa. set. Alter(35); mitarbeiter. DAO. change. Mitarbeiter(lisa); System. out. println(mitarbeiter. DAO. get. Mitarbeiter(2). to. String()); Mitarbeiter neuer. Mitarbeiter = new Mitarbeiter(5, "Max", "Male", 33, "Chef"); mitarbeiter. DAO. add. Mitarbeiter(neuer. Mitarbeiter); Mitarbeiter[] alle. Mitarbeiter = mitarbeiter. DAO. get. All. Mitarbeiter(); for (Mitarbeiter mitarbeiter : alle. Mitarbeiter) { System. out. println(mitarbeiter. to. String()); } mitarbeiter. DAO. remove. Mitarbeiter(neuer. Mitarbeiter); } catch (Exception ex) { } } } Schnaiter

Übung zu JDOM + XPath <? xml? > Ø Realisieren Sie die Klasse Xml.

Übung zu JDOM + XPath <? xml? > Ø Realisieren Sie die Klasse Xml. Mitarbeiter. DAO. java Ø Nutzen Sie hierfür JDOM und XPath Ø Verwalten Sie ihre Mitarbeiter in der Datei employees. xml Schnaiter