Features und Properties

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

SAX benutzt so genannte Properties und Features, um den Parser zu kontrollieren. Alle diese Features und Properties haben einen Namen, der aus einem absoluten URI besteht. Wie beim URI eines Namensraums hat auch der absolute URI eines Features oder eines Propertys keinen technischen Inhalt, insbesondere sollte man nicht erwarten, eine sinnvolle Ausgabe zu bekommen, wenn man den URI in seinen Browser eingibt. Der Zweck eines solchen URIs ist einzig und allein, einen eindeutigen Namen zu vergeben. Features sind entweder true oder false, das heißt, es sind Boolesche Werte. Der Datentyp eines Propertys ist dagegen beliebig. In Java haben Properties daher den Typ Object. Unterschiedliche Parser unterstützen unterschiedliche Gruppen von Features und Properties, obwohl es ein paar gibt, die die meisten Parser standardmäßig unterstützen.

Das Feature "http://xml.org/sax/features/validation" kontrolliert, ob ein Parser validierend ist. Wenn das Feature den Wert true hat, wird der Parser prüfen, ob ein Dokument gültig ist. Falls nicht, wird er dies mit Hilfe eines ErrorHandler melden, sofern ein solcher registriert wurde, andernfalls werden Gültigkeitsprobleme ignoriert. Standardmäßig ist dieses Feature auf false gesetzt. Um ein Feature zu aktivieren, ruft man die XMLReader-Methode setFeature( ) auf und übergibt den Feature-Namen sowie den Wert true:

try {
  parser.setFeature("http://xml.org/sax/features/validation", true);
}
catch (SAXNotSupportedException ex) {
  System.out.println("Die Validierung kann momentan nicht eingeschaltet werden.");
}
catch (SAXNotRecognizedException ex) {
  System.out.println("Dies ist kein validierender Parser.");
}

Nicht alle Parser können validieren. Wenn man versucht, die Validierung in einem Parser einzuschalten, der dazu nicht in der Lage ist, oder wenn man versucht, irgendein Feature zu setzen, das der Parser nicht kennt, resultiert der entsprechende Aufruf von setFeature( ) in einer SAXNotRecognizedException. Versucht man ein Feature zu setzen, das der Parser kennt, momentan aber nicht ändern kann, löst die Methode setFeature( ) eine SAXNotSupported-Exception aus. Dieser Fall kann zum Beispiel auftreten, wenn man die Validierung einschalten möchte, obwohl der Parser schon das halbe Dokument gelesen hat. Bei beiden Exceptions handelt es sich um Unterklassen von SAXException.

Den aktuellen Wert eines Features kann man mit der XMLReader-Methode getFeature( ) überprüfen. Der Rückgabewert dieser Methode hat den Typ boolean, ein Aufruf der Methode kann aber dieselben Exceptions bewirken wie ein Aufruf von setFeature( ). Wenn man wissen will, ob ein Parser validiert, sollte das also so geschehen:

try {
  boolean isValidating =
   parser.getFeature("http://xml.org/sax/features/validation");
}
catch (SAXException e) {
  System.out.println("Dies ist kein validierender Parser.");
}

Ein Property ist etwas Ähnliches wie ein Feature, kann aber völlig andere Werte annehmen als einfach true oder false. Der Wert einer Property ist ein Objekt eines unbekannten Typs. Um die vom Dokument verwendete XML-Version (1.0 oder 1.1) zu ermitteln, lesen Sie mit der Methode getProperty( ) beispielsweise das Property "http://xml.org/sax/properties/document-xml-version":

try {
  String version = (String) parser.getProperty(
   "http://xml.org/sax/properties/document-xml-version");
  if ("1.0".equals(version) {
    System.out.println("Ein gutes konservatives Dokument");
  }
  else if ("1.1".equals(version) {
    System.out.println("Ein gefährlich radikales Dokument");
  }
  else {
    System.out.println("Ein sehr seltsames Dokument: " + version);
  }
}
catch (SAXNotSupportedException ex) {
  System.out.println(
    "Kann die vom Dokument verwendete XML-Version zurzeit nicht angeben.");
}
catch (SAXNotRecognizedException ex) {
  System.out.println("Der Parser erkennt das " +
   "http://xml.org/sax/properties/document-xml-version-Property nicht");
}

Der Wert eines Propertys kann durch den Aufruf der Methode setProperty( ) geändert werden, wobei man wieder zwei Argumente übergibt. Das erste Argument ist der URI des Propertys. Das zweite Argument ist das Objekt mit dem neuen Wert. Das folgende Beispiel versucht, das Property "http://xml.org/sax/properties/LexicalHandler" zu setzen, und übergibt als Wert eine Instanz der Klasse MyLexicalHandlerClass. Der Parser meldet lexikalische Events (Kommentare, CDATA-Abschnitte und Entity-Referenzen) über dieses Objekt, das die Klasse org.xml.sax.ext.LexicalHandler implementieren muss:

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

Wenn man eine falsche Art von Objekt an ein Property übergibt, löst der Aufruf der Methode setProperty( ) eine SAXNotSupportedException aus. Das passiert beispielsweise, wenn man ein Objekt, das das Interface LexicalHandler nicht implementiert, an das Property "http://xml.org/sax/properties/LexicalHandler" übergibt.

Es können nicht alle Features und Properties gesetzt werden. Einige Features wie "http://xml.org/sax/properties/document-xml-version" können nur gelesen werden. Andere können nur zu bestimmten Zeiten gesetzt werden, andere nicht. Zum Beispiel können Sie die Validierung nicht mehr einschalten, wenn bereits das halbe Dokument gelesen ist. Versuchen Sie trotzdem, das entsprechende Feature zu setzen, ist das Ergebnis eine SAXNotSupportedException. Man kann dasselbe Feature allerdings zwischen zwei Dokumenten setzen, d.h., nachdem ein XML-Dokument gelesen wurde und bevor ein anderes gelesen wird. Die meisten Features und Properties können jederzeit gelesen werden, obwohl ein paar (wie "http://xml.org/sax/properties/document-xml-version") nur gelesen werden können, wenn der Parser bereits damit begonnen hat, das Dokument zu lesen.

  

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