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)