© aller Texte: msw 1999-2008
Tutorials / Mit Xerces parsen Teil 1 | Teil 2 | Teil 3 | Teil 4 | Teil 5 | Teil 6 | Teil 7

Mit Xerces parsen - Teil 7


Im siebtenTeil über den Parser Xerces sehen wir an, wie man eine XML-Datei gegen eine XML Schema-Datei validiert...

             
Das Validieren gegen eine XML Schema-Datei ist eine der großen Vorteil des Parsers Xerces. Der Parser in J2SE 1.4 und J2EE 1.3 kann leider nur gegen eine DTD validieren und nicht gegen eine Schema-Datei. Wir sehen uns den Code an, wie man im SAX-Modus gegen eine Schema-Datei validiert. Dazu muss ein so genanntes Feature gesetzt werden. Der SAX-Parser kann über diese Features in begrenztem Rahmen konfiguriert werden. Dazu gehört der Support von Namensräumen und das Validieren gegen eine Schema-Datei.      

Ein Feature wird im SAX-Modus durch eine URL angegeben. Bei dem Validieren  gegen eine Schema-Datei ist dies http://xml.org/sax/features/validation . Bei der Standardisierung von SAX hat man sich darauf geeinigt, für jedes  Feature eine spezielle URL anzugeben. Wird dieses Feature auf true gesetzt,  erkennt der SAX-Parser, das er gegen eine Schema-Datei validieren muss. Das  Setzen eines Features erfolgt über SAXParserFactory, in dem die Methode setFeature() eingesetzt wird:

             SAXParserFactory factory = SAXParserFactory.newInstance();
             factory.setFeature("http://xml.org/sax/features/validation", true);

Die Methode setFeature() erwartete zwei Übergabeparameter. Der erste  Wert ist die URL des konkreten Features. Der zweite Wert ist true. Damit ist der Parser für das Validieren gegen eine XML-Schema-Datei konfiguriert.       

Der weitere Code ist bekannter SAX-Code. Hier ist der gesamte Code abgedruckt:

import java.io.*;
import org.xml.sax.*;
import org.xml.sax.helpers.*;
import javax.xml.parsers.*;
public class parsing extends DefaultHandler {
    public static void main(String param[]) {
        if (param.length!=1){
            System.out.println("uebergabeparameter vergessen");
            System.exit(1);
        }
        DefaultHandler handler = new parsing();
        File datei=new File(param[0]);
        boolean laden=datei.canRead();
        if (laden)  {
          try {
             SAXParserFactory factory = SAXParserFactory.newInstance();
             factory.setFeature("http://xml.org/sax/features/validation", true);
             SAXParser saxParser = factory.newSAXParser();
             saxParser.parse(datei,handler);
           }
          catch (SAXParseException error)  {
            System.out.println("\n+++Parse Error+++"+ "\nZeile: " + error.getLineNumber() + "\nDatei: " + error.getSystemId());
            System.out.println("\n" + error.getMessage() );
         }
         catch (Throwable t)  {
            t.printStackTrace();
           }
        }
       else    {
         System.out.println("datei existiert nicht!");
       }
    }
public void startDocument() throws SAXException {
          System.out.println("Parsen startet");
}
public void endDocument() throws SAXException {
          System.out.println("Parsen beendet");
}
}


Die Applikation wird jetzt von der Eingabeaufforderung über den Java-Interpreter  aufgerufen:

java parsing news.xml

Es muss nur die XML-Datei an die Applikation parsing übergeben werden.  Die Schema-Datei muss hier noch nicht angegeben werden. Welche Schema-Datei  zur XML-Datei gehört, wird direkt in der XML-Datei angegeben. Die zu  parsende XML-Datei sieht so aus:

<?xml version="1.0"?>
<news xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="index.xsd">
   <aufzaehlung rubrik="browser" wichtig="ja">
      <datum>02.02.2003</datum>
      <test>neuer Browser ist da!</test>
   </aufzaehlung>
 </news>


Das Wurzelelemnt ist <news> und dort wird der Namensraum xsi für  das Schema definiert. Darin finden Sie auch die Angabe der Schema-Datei, hier ist es index.xsd:

<news xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="index.xsd">

Die gesamte Schema-Datei sieht so aus:

<?xml version="1.0" encoding="iso-8859-1"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <xsd:element name="root">
   <xsd:complexType>
      <xsd:sequence>
       <xsd:element name="aufzaehlung">
         <xsd:complexType>
           <xsd:sequence>
             <xsd:element name="datum" type="xsd:string" />
             <xsd:element name="text" type="xsd:string" />
           </xsd:sequence>
           <xsd:attribute name="rubrik" type="xsd:string" use="required" />
           <xsd:attribute name="wichtig" type="xsd:string" use="required" />
         </xsd:complexType>
       </xsd:element>
        </xsd:sequence>
      </xsd:complexType>
   </xsd:element>
</xsd:schema>


       

  Starten Sie jetzt die Applikation parsing und übergeben Sie die Datei  news.xml mit der dazugehörigen Schema-Datei (beide Dateien sind auch in der ZIP-Datei enthalten!). Der SAX-Parser sollte jetzt ohne Probleme die XML-Datei gegen die Schema-Datei validieren und keinen Fehler melden...

  Um eine Fehlermeldung zu erhalten, streichen Sie einmal die beiden Attribute rubrik und wichtig aus dem Tag <aufzaehlung> in der Datei news.xml.  Starten Sie dann den Parser neu und übergeben  Sie die abgeänderte  Datei news.xml. Da in der Schema-Datei beide Attribute auf required gesetzt sind

                        <xsd:attribute name="rubrik" type="xsd:string" use="required"/>
                         <xsd:attribute name="wichtig" type="xsd:string" use="required"/>

sollte der Parser jetzt einen Fehler melden, da die beiden Attribute nicht  vorhanden sind....

Jetzt können Sie mit Xerces jede XML-Datei gegen eine dazugehörige  Schema-Datei validieren.



Tutorials / Mit Xerces parsen Teil 1 | Teil 2 | Teil 3 | Teil 4 | Teil 5 | Teil 6 | Teil 7