Das Package org.xml.sax.ext

(Auszug aus "XML in a Nutshell" von Elliotte Rusty Harold & W. Scott Means)

Das Package org.xml.sax.ext enthält zusätzliche Interface-Definitionen, die den SAX-Kern um weitere Funktionalität ergänzen. Diese Funktionalitäten werden von den meisten bedeutenden Parsern unterstützt. Man kann allerdings nicht sicher sein, dass sie von allen Parsern unterstützt werden.

 


Das Interface Attributes2

SAX 2.0.2 führt die Attributes2-Unterklasse von Attributes ein, die zusätzliche Methoden bietet, mit denen festgestellt werden kann, ob ein Attribut in der DTD deklariert und/oder in der Dokument-Instanz angegeben wurde (und nicht einfach auf Basis der DTD standardmäßig eingefügt wurde). Ein Parser, der Attributes2 unterstützt, übergibt anstelle eines einfachen Attributes-Objekts ein Attributes2-Objekt an startElement(). Die Verwendung der zusätzlichen Methoden macht eine Typumwandlung erforderlich. Vor der Umwandlung sollten Sie eventuell prüfen, ob die Umwandlung erfolgreich sein wird, indem Sie sich den Wert der Features "http://xml.org/sax/features/use-attributes2" verschaffen. Ist dieses Feature auf true gesetzt, übergibt der Parser Attributes2-Objekte.

package org.xml.sax.ext;

public interface Attributes2 {

  public boolean isDeclared(int index);
  public boolean isDeclared(String qualifiedName);
  public boolean isSpecified(StringnamespaceURI, StringlocalName);
  public boolean isSpecified(int
 index);public boolean isSpecified(String qualifiedName);
  public boolean isSpecified(StringnamespaceURI, StringlocalName);

}

 


Das Interface DeclHandler

Das Interface DeclHandler ist ein weiteres Callback-Interface, über das ein Parser Informationen anbietet, in diesem Fall über die Deklarationen in der DTD des Dokuments. Um einen XMLReader mit einem DeclHandler zu versehen, setzt man das Property "http://xml.org/sax/handlers/DeclHandler" und übergibt als Objekt den DeclHandler. Das geschieht mit der Methode setProperty() des XMLReader:

try {
   parser.setProperty(
     "http://xml.org/sax/properties/DeclHandler",
      new YourDeclHandlerImplementationClass());
 }
 catch(SAXException e) {
   System.out.println("Dieser Parser kann keine Informationen über Deklarationen
                         liefern.");
 }

Wenn der Parser Deklarationen nicht unterstützt, zeigt er dies durch Auslösen einer SAXNotRecognizedException. Kann der Parser aber nur in diesem Moment keinen DeclHandler setzen (normalerweise weil er gerade ein Dokument parst), löst er eine SAXNotSupportedException aus. Wird keine Exception ausgelöst, ist der DeclHandler gesetzt, und beim Parsen der DTD werden seine Methoden aufgerufen:

package org.xml.sax.ext;

public interface DeclHandler {

  public void elementDecl(String name, String model) throws SAXException;
  public void attributeDecl(String
 elementName, String attributeName,
 String type, String defaultValue, String value) throws SAXException;
  public void internalEntityDecl(String name, String value)
 throws SAXException;
  public void externalEntityDecl(String name, String publicID,
String systemID) throws SAXException;

}

 


Das Interface EntityResolver2

SAX 2.0.2 führt eine EntityResolver2-Unterklasse von EntityResolver ein, die zusätzliche Methoden für eine flexible Auflösung von Entities bietet. Insbesondere ermöglicht es einem Programm eine externe DTD-Teilmenge für ein Dokument anzugeben, das keine Dokumenttyp-Deklaration besitzt. Es ermöglicht es außerdem, Entities anhand des Namens des Wurzelelements und einer Basis-URL oder anhand eines PUBLIC- oder eines SYSTEM-Identifiers aufzulösen. Ihr Code kann immer ein EntityResolver2-Objekt an setEntityResolver() übergeben. Ein Parser, der EntityResolver2 nicht unterstützt, ignoriert die zusätzlichen Methoden einfach. Das Feature "http://xml.org/sax/features/use-entity-resolver2" sagt Ihnen, ob der Parser die zusätzlichen Methoden in EntityResolver2 verwendet oder nicht.

package org.xml.sax.ext;

public interface EntityResolver2 {

  public InputSource getExternalSubset(String name, String baseURI);
  public InputSource resolveEntity(
  String name, String publicID, String baseURI, String systemID);

}

 


Das Interface LexicalHandler

Das Interface LexicalHandler ist ein weiteres Callback-Interface, über das ein Parser Informationen weitergibt. In diesem Fall geht es um Informationen, die normalerweise nicht relevant sind, genauer gesagt um:

  • CDATA-Abschnitte
  • Entity-Grenzen
  • DTD-Grenzen
  • Kommentare

Ohne einen LexicalHandler ignoriert der Parser Kommentare und expandiert Texte von Entity-Referenzen und CDATA-Abschnitten. Durch das Interface LexicalHandler kann man Kommentare erhalten, und man weiß, welche Texte aus normalen Textabschnitten, aus CDATA-Abschnitten und aus Entity-Referenzen kamen.

Die Konfiguration eines XMLReader mit einem LexicalHandler geschieht ebenfalls durch die Methode setProperty() der Handler-Klasse. In diesem Fall wird der Property-Name "http://xml.org/sax/properties/LexicalHandler" verwendet:

try {
   parser.setProperty(
   "http://xml.org/sax/properties/LexicalHandler",
    new YourLexicalHandlerClass()
   );
 }
 catch(SAXException ex) {
  System.out.println("Dieser Parser unterstützt keine lexikalischen Events.");
 }

Wenn der Parser keine lexikalischen Events unterstützt, löst er eine SAXNotRecognizedException aus. Kann der Parser nur in diesem Moment gerade keinen LexicalHandler setzen (normalerweise, weil er gerade ein Dokument parst), löst er eine SAXNotSupportedException aus. Wird keine Exception ausgelöst, ist der LexicalHandler gesetzt, und beim Parsen des Dokuments werden seine Methoden aufgerufen. Die Inhalte der CDATA-Abschnitte und der geparsten Entities werden aber nach wie vor über das Interface ContentHandler übertragen:

package org.xml.sax.ext;

public interface LexicalHandler {

  public void startDTD(String name,
String publicID,
String systemID) throws SAXException;
  public void endDTD() throws SAXException;
  public void startEntity(String name)
 throws SAXException;
  public void endEntity(String name)
 throws SAXException;
  public void startCDATA() throws SAXException;
  public void endCDATA() throws SAXException;
  public void comment(char[] text, int start, int length)
 throws SAXException;

}

 


Das Interface Locator2

SAX 2.0.2 führt eine Locator2-Unterklasse von Locator ein, die zusätzliche Methoden bietet, mit denen die Zeichenkodierungund die XML-Version des aktuellen Entitys ermittelt werden können. Ein Parser, der Locator2 unterstützt, übergibt anstelle eines Locator-Objekts einfach ein Locator2-Objekt an setLocator(). Die Verwendung der zusätzlichen Methoden macht eine Typumwandlung erforderlich. Vor der Umwandlung sollten Sie prüfen, ob die Umwandlung erfolgreich ist, indem Sie den Wert des Features "http://xml.org/sax/features/use-locator2" abrufen. Ist dieses Feature auf true gesetzt, dann übergibt der Parser Locator2-Objekte.

package org.xml.sax.ext;

public interface EntityResolver2 {

 public String getXMLVersion();
 public String getEncoding();

}

Die Methode getXMLVersion() liefert die Version des aktuellen Entitys zurück. Das Property "http://xml.org/sax/properties/document-xml-version" liefert die Version des aktuellen Dokuments zurück. Diese können gleich sein, müssen es aber nicht.

  

<< zurück vor >>

 

 

 

Tipp der data2type-Redaktion:
Zum Thema XML bieten wir auch folgende Schulungen zur Vertiefung und professionellen Fortbildung an:

  


Copyright © 2005 O'Reilly Verlag GmbH & Co. KG
Für Ihren privaten Gebrauch dürfen Sie die Online-Version ausdrucken.
Ansonsten unterliegt dieses Kapitel aus dem Buch "XML in a Nutshell" 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.

O’Reilly Verlag GmbH & Co. KG, Balthasarstraße 81, 50670 Köln, kommentar(at)oreilly.de