views:

143

answers:

1

Hi Guyz,

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"&gt;
 <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'.

Could you please help me!

+1  A: 

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">
Pavel Minaev
Thank you for your quick reply :D
Mohammed