I am using the following code to validate an an XML file against a XSD schema
package com.forat.xsd;
import java.io.IOException;
import java.net.URL;
import javax.xml.XMLConstants;
import javax.xml.transform.Source;
import javax.xml.transform.stream.StreamSource;
import javax.xml.validation.Schema;
import javax.xml.validation.SchemaFactory;
import javax.xml.validation.Validator;
import org.xml.sax.ErrorHandler;
import org.xml.sax.SAXException;
import org.xml.sax.SAXParseException;
public class XSDValidate {
public void validate(String xmlFile, String xsd_url) {
try {
SchemaFactory factory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
Schema schema = factory.newSchema(new URL(xsd_url));
Validator validator = schema.newValidator();
ValidationHandler handler = new ValidationHandler();
validator.setErrorHandler(handler);
validator.validate(getSource(xmlFile));
if (handler.errorsFound == true) {
System.err.println("Validation Error : "+ handler.exception.getMessage());
}else {
System.out.println("DONE");
}
} catch (SAXException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
private Source getSource(String resource) {
return new StreamSource(XSDValidate.class.getClassLoader().getResourceAsStream(resource));
}
private class ValidationHandler implements ErrorHandler {
private boolean errorsFound = false;
private SAXParseException exception;
public void error(SAXParseException exception) throws SAXException {
this.errorsFound = true;
this.exception = exception;
}
public void fatalError(SAXParseException exception) throws SAXException {
this.errorsFound = true;
this.exception = exception;
}
public void warning(SAXParseException exception) throws SAXException {
}
}
/*
* Test
*/
public static void main(String[] args) {
new XSDValidate().validate("com/forat/xsd/reply.xml",
"https://ics2wstest.ic3.com/commerce/1.x/transactionProcessor/CyberSourceTransaction_1.53.xsd"); // return error
}
}
As appears, It is a standard code that try to validate the following XML file:
<?xml version="1.0" encoding="UTF-8"?>
<replyMessage xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<merchantReferenceCode>XXXXXXXXXXXXX</merchantReferenceCode>
<requestID>XXXXXXXXXXXXX</requestID>
<decision>XXXXXXXXXXXXX</decision>
<reasonCode>XXXXXXXXXXXXX</reasonCode>
<requestToken>XXXXXXXXXXXXX
</requestToken>
<purchaseTotals>
<currency>XXXXXXXXXXXXX</currency>
</purchaseTotals>
<ccAuthReply>
<reasonCode>XXXXXXXXXXXXX</reasonCode>
<amount>XXXXXXXXXXXXX</amount>
<authorizationCode>XXXXXXXXXXXXX</authorizationCode>
<avsCode>XXXXXXXXXXXXX</avsCode>
<avsCodeRaw>XXXXXXXXXXXXX</avsCodeRaw>
<authorizedDateTime>XXXXXXXXXXXXX</authorizedDateTime>
<processorResponse>0XXXXXXXXXXXXX</processorResponse>
<authRecord>XXXXXXXXXXXXX
</authRecord>
</ccAuthReply>
</replyMessage>
Against the following XSD:
https://ics2wstest.ic3.com/commerce/1.x/transactionProcessor/CyberSourceTransaction_1.53.xsd
The error is :
Validation Error : cvc-elt.1: Cannot find the declaration of element 'replyMessage'.
Your XML is invalid, because it is not in the namespace required by the schema:
targetNamespace="urn:schemas-cybersource-com:transaction-data-1.53"
You need to change the opening tag of the root element to:
<replyMessage xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="urn:schemas-cybersource-com:transaction-data-1.53">