next up previous contents
Nächste Seite: XML-Daten verwenden, DOM Aufwärts: XML-Grundlagen, SAX Vorherige Seite: Elemente zählen   Inhalt

Eine XML-Datei auf Gültigkeit hin prüfen

Erfüllt eine XML-Datei (zumindest) die Forderungen nach korrekter Schachtelung und vollständigen Attribut-Attributwertpaaren, so heißt sie wohlgeformt. Zusätzlich kann jede XML-Datei gegenüber einer so genannten DocumentTypeDefinition (.dtd - Datei) oder gegenüber einer so genannten Schema-Datei (.xsd - Datei) auf Gültigkeit hin überprüft werden. Für unsere XML-Datei verwenden wir dazu die folgende DTD:

  <!ELEMENT skriptum (autor, kategorie, hersteller, version)>
    <!ELEMENT autor (vorname, famname)>
      <!ELEMENT vorname (#PCDATA)>
      <!ELEMENT famname (#PCDATA)>
    <!ELEMENT kategorie (#PCDATA)>
    <!ELEMENT hersteller (#PCDATA)>
    <!ELEMENT version (nummer,datum)>
      <!ELEMENT nummer (#PCDATA)>
      <!ELEMENT datum (#PCDATA)>
  <!ATTLIST skriptum titel CDATA "">

Damit für den Parser klar ist, welche DTD zu welcher XML-Datei gehört, fügen wir in die XML-Datei einen entsprechenden Hinweis ein:

<?xml version="1.0"?>
<!DOCTYPE skriptum SYSTEM "test.dtd">
<skriptum titel="Java">
  <autor>
    <vorname>Alfred</vorname>
    <famname>Nussbaumer</famname>
  </autor>
  <kategorie>Beispielsammlung</kategorie>
  <hersteller>LaTeX</hersteller>
  <version>
    <nummer>1.0</nummer> 
    <datum>2003-02-10</datum>
  </version> 
</skriptum>

In die Java-Applikation muss noch die SAXParserFactory - Methode setValidating() den Wert true übernehmen:

import javax.xml.parsers.*;
import org.xml.sax.*;
import org.xml.sax.helpers.*;

public class XML1 extends DefaultHandler {

    static String dateiname;

    public void parsen(String args[]) throws Exception {
        SAXParserFactory fabrik = SAXParserFactory.newInstance();
        fabrik.setValidating(true);
        SAXParser parser = fabrik.newSAXParser();
        XMLReader reader = parser.getXMLReader();
        reader.setContentHandler(this);
        reader.parse(args[0]);
    }

    public void endDocument() throws SAXException {
        System.out.println("Die Datei " + dateiname + " wurde erfolgreich geparst");
    }

    public static void main (String [] args) throws Exception {
        dateiname = args[0];
        (new XML1()).parsen(args);
    }
}

Damit wird der Inhalt der XML-Datei gegenüber den Vorgaben der DTD geprüft. Stimmen die Vorgaben in der DTD mit den tatsächlichen Inhalten der XML-Datei überein, so heißt die XML-Datei gültig. Ergeben sich (auch noch so) geringe Abweichungen, so erhalten wir Meldungen wie die folgende:

alfred@duron:~/java/xml> java XML1 test.xml
Warning: validation was turned on but an org.xml.sax.ErrorHandler was not
set, which is probably not what is desired.  Parser will use a default
ErrorHandler to print the first 10 errors.  Please call
the 'setErrorHandler' method to fix this.
Error: URI=file:///home/alfred/java/xml/test.xml Line=14: Elementtyp "seitenzahl" muss deklariert werden.
Error: URI=file:///home/alfred/java/xml/test.xml Line=15: Der Inhalt von Elementtyp "skriptum" muss 
"(autor,kategorie,hersteller,version)" entsprechen.

(Der Grund für diese Meldungen ist, dass ein neues Element <seitenzahl> verwendet wurde, ohne dass dieses in der DTD vorgesehen ist)


next up previous contents
Nächste Seite: XML-Daten verwenden, DOM Aufwärts: XML-Grundlagen, SAX Vorherige Seite: Elemente zählen   Inhalt
Alfred Nussbaumer 2003-02-10