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