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)