#

XMLBeans & dynamische Schemavalidierung

In letzter Zeit arbeite ich sehr viel mit der sehr guten XMLBeans API von Apache. Anbei ein kleines Programm, welches ein SchemaTypeLoader Objekt aus einer XSD Datei erzeugt und diese zum Validieren einer XML Datei benutzt.

Diese Klasse kann als Basis für ein Programm benutzt werden, welches die XSD Definitionen dynamisch aus einer Datei oder einer Datenbank lädt um damit verschiedene XML Dokumente zu validieren.

import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
 
import org.apache.xmlbeans.SchemaTypeLoader;
import org.apache.xmlbeans.XmlBeans;
import org.apache.xmlbeans.XmlException;
import org.apache.xmlbeans.XmlObject;
import org.apache.xmlbeans.XmlOptions;
 
public class DynamicSchemaValidator {
 
/**
 * Aufruf: <br/>
 * arg[0] XSD-Datei
 * arg[1] XML-Datei
 * @param args
 */
public static void main(String[] args) {
if (args.length<2){
System.out.println("Enter at least two arguments: "+
"xsd file and xml file to validate.");
System.exit(0);
}
SchemaTypeLoader schemaTypeLoader = 
loadSchema(new File(args[0]));
checkXml(schemaTypeLoader, new File(args[1]));
}
 
public static void checkXml(SchemaTypeLoader schemaTypeLoader, 
File xmlFile){
System.out.println("checking xml file "+xmlFile);
List errors = new ArrayList();
try {
XmlObject xo = schemaTypeLoader.parse(xmlFile, null, 
new XmlOptions().
setLoadLineNumbers().setErrorListener(errors));
if (xo.validate(new XmlOptions().
setLoadLineNumbers().setErrorListener(errors))){
System.out.println("VALID");
}
else System.out.println("NOT valid");
if (errors.size()>0) printXmlErrors(errors);
}
catch (XmlException e) {
if (errors.size()<=0) errors.add(e);
printXmlErrors(errors);
}
catch (IOException e) {
e.printStackTrace();
}
}
 
public static SchemaTypeLoader loadSchema(File schemaFile) {
System.out.println("loading schema "+schemaFile);
List errors = new ArrayList();
XmlObject schema;
SchemaTypeLoader schemaTypeLoader = null;
try {
schema = XmlObject.Factory.parse(schemaFile, 
new XmlOptions()
.setLoadLineNumbers().setLoadMessageDigest()
.setErrorListener(errors));
if (errors.size()>0){ 
printXmlErrors(errors);
System.exit(-1);
}
 
XmlOptions schemaOptions = new XmlOptions().
setErrorListener(errors).setLoadLineNumbers();
XmlObject[] schemas = { schema };
schemaTypeLoader = XmlBeans.compileXsd(
schemas, schemaTypeLoader, schemaOptions);
}
catch (XmlException e) {
if (errors.size()<=0) errors.add(e);
printXmlErrors(errors);
System.exit(-1);
}
catch (IOException e) {
e.printStackTrace();
System.exit(-1);
}
return schemaTypeLoader;
}
 
public static void printXmlErrors(List errors){
System.out.println("XML Errors:");
for (int i=0; i<errors.size(); i++)
System.out.println(errors.get(i).toString());
} 
}
Tags:, ,

Leave a Reply »»

Note: All comments are manually approved to avoid spam. So if your comment doesn't appear immediately, that's ok. Have patience, it can take some days until I have the time to approve my comments.