package testSchema;
import java.io.IOException;
import java.io.InputStream;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import org.apache.commons.codec.binary.Base64;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.Namespace;
import org.dom4j.io.SAXReader;
import org.dom4j.tree.DefaultNamespace;
import org.iso_relax.verifier.Schema;
import org.iso_relax.verifier.Verifier;
import org.iso_relax.verifier.VerifierConfigurationException;
import org.iso_relax.verifier.VerifierFactory;
import org.iso_relax.verifier.VerifierFilter;
import org.xml.sax.EntityResolver;
import org.xml.sax.ErrorHandler;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;
import org.xml.sax.SAXParseException;
import com.sun.msv.verifier.jarv.TheFactoryImpl;
public class ValidateXML {
public Document validate(InputStream stream, String xsdName) throws IOException{
Document result = null;
InputStream xmlStream = stream;
InputStream schemaStream = this.getClass().getResourceAsStream(xsdName);
SAXReader reader;
try {
reader = createSAXReader(schemaStream);
result = reader.read(xmlStream);
xmlStream.close();
schemaStream.close();
} catch (DocumentException e) {
System.out.println("Validate failed !");
e.printStackTrace();
} catch(IOException e) {
System.out.println("Xsd file does not exist !");
e.printStackTrace();
}
catch (Exception e) {
System.out.println("Xsd file format error !");
e.printStackTrace();
}
return result;
}
private SAXReader createSAXReader(InputStream xsdStream) throws VerifierConfigurationException, SAXException, IOException {
VerifierFactory factory = new TheFactoryImpl();
Schema schema = factory.compileSchema(xsdStream);
Verifier verifier = schema.newVerifier();
verifier.setErrorHandler(new ErrorHandler() {
public void error(SAXParseException e) {
System.out.println("ERROR: " + e);
}
public void fatalError(SAXParseException e) {
System.out.println("FATAL: " + e);
}
public void warning(SAXParseException e) {
System.out.println("WARNING: " + e);
}
});
// now install the verifying filter
VerifierFilter filter = verifier.getVerifierFilter();
SAXReader reader = new SAXReader();
reader.setXMLFilter(filter);
return reader;
}
public static void main(String[] args) throws IOException {
ValidateXML validateXML = new ValidateXML();
// InputStream schemaStream = validateXML.getClass().getResourceAsStream("Response.xml");
// validateXML.validate(schemaStream, "BAK-Response.xsd");
validateXML.validateByDtd("hibernate-configuration-3.0.dtd", "src\\testSchema\\hibernate.cfg.xml");
}
public Document validateByDtd(String dtdFile, String xmlFile) {
List errors = new ArrayList();
SAXReader saxReader = new SAXReader();
saxReader.setEntityResolver(new DTDEntityResolver(dtdFile));
saxReader.setErrorHandler(new ErrorLogger(xmlFile, errors));
saxReader.setValidation(true);
Document doc = null;
try {
doc = saxReader.read(xmlFile);
} catch (DocumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return doc;
}
public static class ErrorLogger implements ErrorHandler {
private String file;
private List errors;
ErrorLogger(String file, List errors) {
this.file=file;
this.errors = errors;
}
public void error(SAXParseException error) {
System.err.println( "Error parsing XML: " + file + '(' + error.getLineNumber() + ") " + error.getMessage() );
errors.add(error);
}
public void fatalError(SAXParseException error) {
System.err.println(error);
}
public void warning(SAXParseException warn) {
System.err.println( "Warning parsing XML: " + file + '(' + warn.getLineNumber() + ") " + warn.getMessage() );
}
}
public static class DTDEntityResolver implements EntityResolver, Serializable {
private static final Log log = LogFactory.getLog( DTDEntityResolver.class );
private String dtdFile;
public DTDEntityResolver(String dtdFile) {
this.dtdFile = dtdFile;
}
public InputSource resolveEntity(String publicId, String systemId) {
if ( systemId != null ) {
InputStream dtdStream = this.getClass().getResourceAsStream(dtdFile);
InputSource source = new InputSource( dtdStream );
source.setPublicId( publicId );
source.setSystemId( systemId );
return source;
}
// use default behavior
return null;
}
}
}