Last active
September 29, 2020 00:32
-
-
Save ppazos/d0353817f74a1385bbf1 to your computer and use it in GitHub Desktop.
Groovy XSD Validation a-la Java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import javax.xml.parsers.SAXParserFactory | |
import javax.xml.validation.SchemaFactory | |
import org.xml.sax.SAXException | |
import org.xml.sax.SAXParseException | |
import org.xml.sax.ErrorHandler | |
import javax.xml.transform.Source | |
import javax.xml.transform.stream.StreamSource | |
import javax.xml.parsers.SAXParser | |
import org.xml.sax.XMLReader | |
import org.xml.sax.InputSource | |
import javax.xml.XMLConstants | |
import javax.xml.validation.Schema | |
import javax.xml.validation.Validator | |
def benchmark = { closure -> | |
start = System.currentTimeMillis() | |
closure.call() | |
now = System.currentTimeMillis() | |
now - start | |
} | |
public class SimpleErrorHandler implements ErrorHandler { | |
def xml_lines | |
public SimpleErrorHandler(String xml) { | |
this.xml_lines = xml.readLines() | |
} | |
public void warning(SAXParseException e) throws SAXException { | |
println "WARNING: "+ e.getMessage() +" "+ e.getLineNumber() +" "+ this.xml_lines[e.getLineNumber()-1] //e.getSystemId() | |
} | |
public void error(SAXParseException e) throws SAXException { | |
println "ERROR: "+ e.getMessage() +" "+ e.getLineNumber() | |
println this.xml_lines[e.getLineNumber()-1] // line of the problem in the XML | |
(e.getColumnNumber()-1).times{ print " " } // marks the column | |
println "^" | |
} | |
public void fatalError(SAXParseException e) throws SAXException { | |
println "FATAL ERROR: "+ e.getMessage() +" "+ e.getLineNumber() +" " this.xml_lines[e.getLineNumber()-1] | |
} | |
} | |
def duration = benchmark { | |
def path = 'C:\\Documents and Settings\\pab\\My Documents\\GitHub\\cabolabs-emrapp\\committed\\composition_3918_0_err.xml' | |
def xml = new File(path).text | |
//println xml | |
// XSD Validation: 2 ways, parsing or with validator. The result is the same, less code with validator. | |
// Validate with parse 1 | |
SAXParserFactory factory = SAXParserFactory.newInstance() | |
factory.setValidating(false) | |
factory.setNamespaceAware(true) | |
// Common code | |
SchemaFactory schemaFactory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI) | |
Schema schema = schemaFactory.newSchema( | |
[ new StreamSource("C:\\Documents and Settings\\pab\\My Documents\\GitHub\\cabolabs-ehrserver\\xsd\\Version.xsd") ] as Source[] | |
) | |
// VAlidate with parse 2 | |
factory.setSchema( schema ) | |
SAXParser parser = factory.newSAXParser() | |
XMLReader reader = parser.getXMLReader() | |
reader.setErrorHandler(new SimpleErrorHandler(xml)) | |
reader.parse(new InputSource(new StringReader(xml))) | |
// Validate with validator | |
// Validator validator = schema.newValidator() | |
// validator.setErrorHandler(new SimpleErrorHandler(xml)) | |
// validator.validate(new StreamSource(new StringReader(xml))) | |
} | |
println "execution took ${duration} ms" |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment