Java SE 8 Standard-Bibliothek  
Professionelle Bücher. Auch für Einsteiger.
 
Inhaltsverzeichnis

Vorwort
1 Neues in Java 8 und Java 7
2 Fortgeschrittene String-Verarbeitung
3 Threads und nebenläufige Programmierung
4 Datenstrukturen und Algorithmen
5 Raum und Zeit
6 Dateien, Verzeichnisse und Dateizugriffe
7 Datenströme
8 Die eXtensible Markup Language (XML)
9 Dateiformate
10 Grafische Oberflächen mit Swing
11 Grafikprogrammierung
12 JavaFX
13 Netzwerkprogrammierung
14 Verteilte Programmierung mit RMI
15 RESTful und SOAP-Web-Services
16 Technologien für die Infrastruktur
17 Typen, Reflection und Annotationen
18 Dynamische Übersetzung und Skriptsprachen
19 Logging und Monitoring
20 Sicherheitskonzepte
21 Datenbankmanagement mit JDBC
22 Java Native Interface (JNI)
23 Dienstprogramme für die Java-Umgebung
Stichwortverzeichnis

Jetzt Buch bestellen
Ihre Meinung?

Spacer
<< zurück
Java SE 8 Standard-Bibliothek von Christian Ullenboom
Das Handbuch für Java-Entwickler
Buch: Java SE 8 Standard-Bibliothek

Java SE 8 Standard-Bibliothek
Pfeil 8 Die eXtensible Markup Language (XML)
Pfeil 8.1 Auszeichnungssprachen
Pfeil 8.1.1 Die Standard Generalized Markup Language (SGML)
Pfeil 8.1.2 Extensible Markup Language (XML)
Pfeil 8.2 Eigenschaften von XML-Dokumenten
Pfeil 8.2.1 Elemente und Attribute
Pfeil 8.2.2 Beschreibungssprache für den Aufbau von XML-Dokumenten
Pfeil 8.2.3 Schema – die moderne Alternative zu DTD
Pfeil 8.2.4 Namensraum (Namespace)
Pfeil 8.2.5 XML-Applikationen *
Pfeil 8.3 Die Java-APIs für XML
Pfeil 8.3.1 Das Document Object Model (DOM)
Pfeil 8.3.2 Simple API for XML Parsing (SAX)
Pfeil 8.3.3 Pull-API StAX
Pfeil 8.3.4 Java Document Object Model (JDOM)
Pfeil 8.3.5 JAXP als Java-Schnittstelle zu XML
Pfeil 8.3.6 DOM-Bäume einlesen mit JAXP *
Pfeil 8.4 Java Architecture for XML Binding (JAXB)
Pfeil 8.4.1 Bean für JAXB aufbauen
Pfeil 8.4.2 Utility-Klasse JAXB
Pfeil 8.4.3 Ganze Objektgraphen schreiben und lesen
Pfeil 8.4.4 JAXBContext und Marshaller/Unmarshaller nutzen
Pfeil 8.4.5 Validierung
Pfeil 8.4.6 Weitere JAXB-Annotationen *
Pfeil 8.4.7 Beans aus XML-Schema-Datei generieren
Pfeil 8.5 Serielle Verarbeitung mit StAX
Pfeil 8.5.1 Unterschiede der Verarbeitungsmodelle
Pfeil 8.5.2 XML-Dateien mit dem Cursor-Verfahren lesen
Pfeil 8.5.3 XML-Dateien mit dem Iterator-Verfahren verarbeiten *
Pfeil 8.5.4 Mit Filtern arbeiten *
Pfeil 8.5.5 XML-Dokumente schreiben
Pfeil 8.6 Serielle Verarbeitung von XML mit SAX *
Pfeil 8.6.1 Schnittstellen von SAX
Pfeil 8.6.2 SAX-Parser erzeugen
Pfeil 8.6.3 Operationen der Schnittstelle ContentHandler
Pfeil 8.6.4 ErrorHandler und EntityResolver
Pfeil 8.7 XML-Dateien mit JDOM verarbeiten
Pfeil 8.7.1 JDOM beziehen
Pfeil 8.7.2 Paketübersicht *
Pfeil 8.7.3 Die Document-Klasse
Pfeil 8.7.4 Eingaben aus der Datei lesen
Pfeil 8.7.5 Das Dokument im XML-Format ausgeben
Pfeil 8.7.6 Der Dokumenttyp *
Pfeil 8.7.7 Elemente
Pfeil 8.7.8 Zugriff auf Elementinhalte
Pfeil 8.7.9 Liste mit Unterelementen erzeugen *
Pfeil 8.7.10 Neue Elemente einfügen und ändern
Pfeil 8.7.11 Attributinhalte lesen und ändern
Pfeil 8.7.12 XPath
Pfeil 8.8 Transformationen mit XSLT *
Pfeil 8.8.1 Templates und XPath als Kernelemente von XSLT
Pfeil 8.8.2 Umwandlung von XML-Dateien mit JDOM und JAXP
Pfeil 8.9 XML-Schema-Validierung *
Pfeil 8.9.1 SchemaFactory und Schema
Pfeil 8.9.2 Validator
Pfeil 8.9.3 Validierung unterschiedlicher Datenquellen durchführen
Pfeil 8.10 Zum Weiterlesen
 
Zum Seitenanfang

8.6Serielle Verarbeitung von XML mit SAX * Zur vorigen ÜberschriftZur nächsten Überschrift

Die Verarbeitung von XML-Dateien mit SAX ist vor dem Erscheinen von StAX die schnellste und speicherschonendste Methode gewesen. Der Parser liest die XML-Datei seriell und ruft für jeden Bestandteil der XML-Datei eine spezielle Methode auf. Der Nachteil ist, dass immer nur ein kleiner Bestandteil einer XML-Datei betrachtet wird und nicht die gesamte Struktur zur Verfügung steht.

 
Zum Seitenanfang

8.6.1Schnittstellen von SAX Zur vorigen ÜberschriftZur nächsten Überschrift

Die bei der Verarbeitung mit SAX anfallenden Ereignisse sind in verschiedenen Schnittstellen festgelegt. Die wichtigste Schnittstelle ist org.xml.sax.ContentHandler. Die Schnittstelle legt die wichtigsten Operationen für die Verarbeitung fest, denn die später realisierten Methoden ruft der Parser beim Verarbeiten der XML-Daten auf.

Die Klasse org.xml.sax.helpers.DefaultHandler ist eine leere Implementierung aller Operationen aus ContentHandler. Zusätzlich implementiert DefaultHandler die Schnittstellen DTDHandler, EntityResolver und ErrorHandler. Auf diese Schnittstellen wird hier nicht näher eingegangen.

Vererbungsbeziehung der SAX-Handler

Abbildung 8.4Vererbungsbeziehung der SAX-Handler

 
Zum Seitenanfang

8.6.2SAX-Parser erzeugen Zur vorigen ÜberschriftZur nächsten Überschrift

Um zum Parsen einer Datei zu kommen, führt der Weg über zwei Fabrikmethoden:

Listing 8.25com/tutego/insel/xml/sax/SaxParty.java, main()

SAXParserFactory factory = SAXParserFactory.newInstance();
SAXParser saxParser = factory.newSAXParser();
DefaultHandler handler = new PartyHandler();
try ( InputStream in = Files.newInputStream( Paths.get( "party.xml" ) ) ) {
saxParser.parse( in, handler );
}

Mit dem SAXParser erledigt parse(…) das Einlesen. Die Methode benötigt die Datei und eine Implementierung der Callback-Methoden, die wir als PartyHandler bereitstellen.

 
Zum Seitenanfang

8.6.3Operationen der Schnittstelle ContentHandler Zur vorigen ÜberschriftZur nächsten Überschrift

DefaultHandler ist eine Klasse, die alle Operationen aus EntityResolver, DTDHandler, ContentHandler und ErrorHandler leer implementiert. Unsere Unterklasse PartyHandler erweitert die Klasse DefaultHandler und überschreibt interessantere Methoden, die wir mit Leben füllen wollen:

Listing 8.26com/tutego/insel/xml/sax/PartyHandler.java, Teil 1

package com.tutego.insel.xml.sax;

import org.xml.sax.Attributes;
import org.xml.sax.helpers.DefaultHandler;

class PartyHandler extends DefaultHandler {

Beim Start und Ende des Dokuments ruft der Parser die Methoden startDocument() und endDocument() auf. Unsere überschriebenen Methoden geben nur eine kleine Meldung auf dem Bildschirm aus:

Listing 8.27com/tutego/insel/xml/sax/PartyHandler.java, Teil 2

@Override
public void startDocument() {
System.out.println( "Document starts." );
}

@Override
public void endDocument() {
System.out.println( "Document ends." );
}

Sobald der Parser ein Element erreicht, ruft er die Methode startElement(…) auf. Der Parser übergibt der Methode die Namensraumadresse, den lokalen Namen, den qualifizierenden Namen und Attribute:

Listing 8.28com/tutego/insel/xml/sax/PartyHandler.java, Teil 3

@Override
public void startElement( String namespaceURI, String localName,
String qName, Attributes atts ) {
System.out.println( "namespaceURI: " + namespaceURI );
System.out.println( "localName: " + localName );
System.out.println( "qName: " + qName );

for ( int i = 0; i < atts.getLength(); i++ )
System.out.printf( "Attribut no. %d: %s = %s%n", i,
atts.getQName( i ), atts.getValue( i ) );
}

Unsere Methode gibt alle notwendigen Informationen eines Elements aus. Falls kein spezieller Namensraum vergeben ist, sind die Strings namespaceURI und localName leer. Der String qName ist immer gefüllt. Die Attribute enthält der Container Attributes. Das schließende Tag eines Elements verarbeitet die Methode endElement(String namespaceURI, String localName, String qName). Bis auf die Attribute sind auch bei dem schließenden Tag alle Informationen für die Identifizierung des Elements vorhanden. Auch hier sind die Strings namespaceURI und localName leer, falls kein spezieller Namensraum verwendet wird.

Den Inhalt eines Elements verarbeitet unsere letzte Methode, characters():

Listing 8.29com/tutego/insel/sax/PartyHandler.java, Teil 4

@Override
public void characters( char[] ch, int start, int length ) {
System.out.println( "Characters:" );

for ( int i = start; i < (start + length); i++ )
System.out.printf( "%1$c (%1$x) ", (int) ch[i] );

System.out.println();
}
}

Es ist nicht festgelegt, ob der Parser den Text in einem Stück liefert oder in kleinen Stücken.[ 87 ](Die Eigenschaft nennt sich Character Chunking: http://www.tutego.de/blog/javainsel/2007/01/character-%E2%80%9Echunking%E2%80%9C-bei-sax/) Zur besseren Sichtbarkeit geben wir neben dem Zeichen selbst auch seinen Hexadezimalwert aus. So beginnt die Ausgabe mit den Zeilen:

Document starts.
namespaceURI:
localName:
qName: party
Attribut no. 0: datum = 31.12.2012
Characters:

(a)
(a) (20) (20) (20)
namespaceURI:
localName:
qName: gast
Attribut no. 0: name = Albert Angsthase
Characters:

(a) (20) (20) (20) (20) (20) (20)
namespaceURI:
localName:
qName: getraenk
Characters:
W (57) e (65) i (69) n (6e)
Characters:

(a) (20) (20) (20) (20) (20) (20)
namespaceURI:
localName:
qName: getraenk
Characters:
B (42) i (69) e (65) r (72)
 
Zum Seitenanfang

8.6.4ErrorHandler und EntityResolver Zur vorigen ÜberschriftZur nächsten Überschrift

Immer dann, wenn der Parser einen Fehler melden muss, ruft er die im ErrorHandler deklarierten Operationen auf:

interface org.xml.sax.ErrorHandler
  • void warning(SAXParseException exception)

  • void error(SAXParseException exception)

  • void fatalError(SAXParseException exception)

Da der DefaultHandler die Methoden warning(…) und error(…) leer implementiert, fällt kein Fehler wirklich auf; nur bei fatalError(…) leitet die Methode den empfangenen Fehler mit throw weiter. Das heißt aber auch, dass zum Beispiel schwache Validierungsfehler nicht auffallen. Eine Implementierung kann aber wie folgt aussehen:

public void error( SAXParseException e ) throws SAXException {
throw new SAXException( saxMsg(e) );
}
private String saxMsg( SAXParseException e ) {
return "Line: " + e.getLineNumber() + ", Column: "
+ e.getColumnNumber() + ", Error: " + e.getMessage();
}

Die Klasse DefaultHandler implementiert ebenso die Schnittstelle EntityResolver, aber auch hier einfach die eine Methode InputSource resolveEntity (String publicId, String systemId) mit einem return null. Das heißt, die Standardimplementierung löst keine Entities auf. Eigene Implementierungen sehen meist im Kern so aus:

InputStream stream = MyEntityResolver.class.getResourceAsStream( dtd );
return new InputSource( new InputStreamReader( stream ) );

Die Variable dtd ist mit dem Pfadnamen einer DTD belegt, die im Klassenpfad liegen muss.

 


Ihre Meinung

Wie hat Ihnen das Openbook gefallen? Wir freuen uns immer über Ihre Rückmeldung. Schreiben Sie uns gerne Ihr Feedback als E-Mail an kommunikation@rheinwerk-verlag.de.

<< zurück
 Zum Rheinwerk-Shop
Zum Rheinwerk-Shop: Java SE 8 Standard-Bibliothek Java SE 8 Standard-Bibliothek
Jetzt Buch bestellen

 Buchempfehlungen
Zum Rheinwerk-Shop: Java ist auch eine Insel
Java ist auch eine Insel


Zum Rheinwerk-Shop: Professionell entwickeln mit Java EE 8
Professionell entwickeln mit Java EE 8


Zum Rheinwerk-Shop: Besser coden
Besser coden


Zum Rheinwerk-Shop: Entwurfsmuster
Entwurfsmuster


Zum Rheinwerk-Shop: IT-Projektmanagement
IT-Projektmanagement


 Lieferung
Versandkostenfrei bestellen in Deutschland, Österreich und der Schweiz
InfoInfo

 
 


Copyright © Rheinwerk Verlag GmbH 2018. Original - https://www.rheinwerk-verlag.de/openbook/
Für Ihren privaten Gebrauch dürfen Sie die Online-Version natürlich ausdrucken. Ansonsten unterliegt das Openbook denselben Bestimmungen, wie die gebundene Ausgabe: Das Werk einschließlich aller seiner Teile ist urheberrechtlich geschützt.
Alle Rechte vorbehalten einschließlich der Vervielfältigung, Übersetzung, Mikroverfilmung sowie Einspeicherung und Verarbeitung in elektronischen Systemen.

 

 
 


20.04.2024 - Sitemap.xml