Rheinwerk Computing < openbook > Rheinwerk Computing - Professionelle Bücher. Auch für Einsteiger.
Professionelle Bücher. Auch für Einsteiger.

Inhaltsverzeichnis
Vorwort
1 Java ist auch eine Sprache
2 Sprachbeschreibung
3 Klassen und Objekte
4 Der Umgang mit Zeichenketten
5 Eigene Klassen schreiben
6 Exceptions
7 Generics<T>
8 Äußere.innere Klassen
9 Besondere Klassen der Java SE
10 Architektur, Design und angewandte Objektorientierung
11 Die Klassenbibliothek
12 Bits und Bytes und Mathematisches
13 Datenstrukturen und Algorithmen
14 Threads und nebenläufige Programmierung
15 Raum und Zeit
16 Dateien, Verzeichnisse und Dateizugriffe
17 Datenströme
18 Die eXtensible Markup Language (XML)
19 Grafische Oberflächen mit Swing
20 Grafikprogrammierung
21 Netzwerkprogrammierung
22 Verteilte Programmierung mit RMI
23 JavaServer Pages und Servlets
24 Datenbankmanagement mit JDBC
25 Reflection und Annotationen
26 Dienstprogramme für die Java-Umgebung
A Die Begleit-DVD
Stichwort
Ihre Meinung?

Spacer
 <<   zurück
Java ist auch eine Insel von Christian Ullenboom
Das umfassende Handbuch
Buch: Java ist auch eine Insel

Java ist auch eine Insel
geb., mit DVD
1482 S., 49,90 Euro
Rheinwerk Computing
ISBN 978-3-8362-1506-0
Pfeil 18 Die eXtensible Markup Language (XML)
  Pfeil 18.1 Auszeichnungssprachen
    Pfeil 18.1.1 Die Standard Generalized Markup Language (SGML)
    Pfeil 18.1.2 Extensible Markup Language (XML)
  Pfeil 18.2 Eigenschaften von XML-Dokumenten
    Pfeil 18.2.1 Elemente und Attribute
    Pfeil 18.2.2 Beschreibungssprache für den Aufbau von XML-Dokumenten
    Pfeil 18.2.3 Schema – eine Alternative zu DTD
    Pfeil 18.2.4 Namensraum (Namespace)
    Pfeil 18.2.5 XML-Applikationen *
  Pfeil 18.3 Die Java-APIs für XML
    Pfeil 18.3.1 Das Document Object Model (DOM)
    Pfeil 18.3.2 Simple API for XML Parsing (SAX)
    Pfeil 18.3.3 Pull-API StAX
    Pfeil 18.3.4 Java Document Object Model (JDOM)
    Pfeil 18.3.5 JAXP als Java-Schnittstelle zu XML
    Pfeil 18.3.6 DOM-Bäume einlesen mit JAXP *
  Pfeil 18.4 Java Architecture for XML Binding (JAXB)
    Pfeil 18.4.1 Bean für JAXB aufbauen
    Pfeil 18.4.2 JAXBContext und die Marshaller
    Pfeil 18.4.3 Ganze Objektgraphen schreiben und lesen
    Pfeil 18.4.4 Validierung
    Pfeil 18.4.5 Weitere JAXB-Annotationen *
    Pfeil 18.4.6 Beans aus XML-Schema-Datei generieren
  Pfeil 18.5 Serielle Verarbeitung mit StAX
    Pfeil 18.5.1 Unterschiede der Verarbeitungsmodelle
    Pfeil 18.5.2 XML-Dateien mit dem Cursor-Verfahren lesen
    Pfeil 18.5.3 XML-Dateien mit dem Iterator-Verfahren verarbeiten *
    Pfeil 18.5.4 Mit Filtern arbeiten *
    Pfeil 18.5.5 XML-Dokumente schreiben
  Pfeil 18.6 Serielle Verarbeitung von XML mit SAX *
    Pfeil 18.6.1 Schnittstellen von SAX
    Pfeil 18.6.2 SAX-Parser erzeugen
    Pfeil 18.6.3 Operationen der Schnittstelle »ContentHandler«
    Pfeil 18.6.4 ErrorHandler und EntityResolver
  Pfeil 18.7 XML-Dateien mit JDOM verarbeiten
    Pfeil 18.7.1 JDOM beziehen
    Pfeil 18.7.2 Paketübersicht *
    Pfeil 18.7.3 Die Document-Klasse
    Pfeil 18.7.4 Eingaben aus der Datei lesen
    Pfeil 18.7.5 Das Dokument im XML-Format ausgeben
    Pfeil 18.7.6 Der Dokumenttyp *
    Pfeil 18.7.7 Elemente
    Pfeil 18.7.8 Zugriff auf Elementinhalte
    Pfeil 18.7.9 Liste mit Unterelementen erzeugen *
    Pfeil 18.7.10 Neue Elemente einfügen und ändern
    Pfeil 18.7.11 Attributinhalte lesen und ändern
    Pfeil 18.7.12 XPath
  Pfeil 18.8 Transformationen mit XSLT *
    Pfeil 18.8.1 Templates und XPath als Kernelemente von XSLT
    Pfeil 18.8.2 Umwandlung von XML-Dateien mit JDOM und JAXP
  Pfeil 18.9 XML-Schema-Validierung *
    Pfeil 18.9.1 SchemaFactory und Schema
    Pfeil 18.9.2 Validator
    Pfeil 18.9.3 Validierung unterschiedlicher Datenquellen durchführen
  Pfeil 18.10 Zum Weiterlesen


Rheinwerk Computing - Zum Seitenanfang

18.6 Serielle Verarbeitung von XML mit SAX *  Zur nächsten ÜberschriftZur vorigen Ü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.


Rheinwerk Computing - Zum Seitenanfang

18.6.1 Schnittstellen von SAX  Zur nächsten ÜberschriftZur vorigen Ü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.


Rheinwerk Computing - Zum Seitenanfang

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

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

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

SAXParserFactory factory = SAXParserFactory.newInstance();
SAXParser saxParser = factory.newSAXParser();
DefaultHandler handler = new PartyHandler();
saxParser.parse( new File("party.xml"), 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.


Rheinwerk Computing - Zum Seitenanfang

18.6.3 Operationen der Schnittstelle »ContentHandler«  Zur nächsten ÜberschriftZur vorigen Ü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 18.22  com/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 18.23  com/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 18.24  com/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 18.25  com/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. [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.01
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)

Rheinwerk Computing - Zum Seitenanfang

18.6.4 ErrorHandler und EntityResolver  topZur vorigen Überschrift

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

  • 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.



Ihr Kommentar

Wie hat Ihnen das <openbook> gefallen? Wir freuen uns immer über Ihre freundlichen und kritischen Rückmeldungen. >> Zum Feedback-Formular
 <<   zurück
 Ihre Meinung?
Wie hat Ihnen das <openbook> gefallen?
Ihre Meinung

 Buchempfehlungen
Zum Katalog: Java ist auch eine Insel






 Java ist auch
 eine Insel


Zum Katalog: Java SE Bibliotheken






 Java SE Bibliotheken


Zum Katalog: Professionell entwickeln mit Java EE 7






 Professionell
 entwickeln mit
 Java EE 7


Zum Katalog: Einstieg in Eclipse






 Einstieg in
 Eclipse


Zum Katalog: Einstieg in Java






 Einstieg in
 Java


 Shopping
Versandkostenfrei bestellen in Deutschland und Österreich
InfoInfo




Copyright © Rheinwerk Verlag GmbH 2011
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.


Nutzungsbestimmungen | Datenschutz | Impressum

Rheinwerk Verlag GmbH, Rheinwerkallee 4, 53227 Bonn, Tel.: 0228.42150.0, Fax 0228.42150.77, service@rheinwerk-verlag.de