2010-06-15 3 views
2

Я использую следующий код для проверки файла XML-против XSD схемыНе удается проверить XML-документ против XSD схемы (не удается найти объявление элемента «replyMessage»)

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 
} 

} 

Как оказывается, стандартный код, попробуйте проверить следующий XML-файл:

<?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> 

на следующей XSD:

https://ics2wstest.ic3.com/commerce/1.x/transactionProcessor/CyberSourceTransaction_1.53.xsd

Ошибка:

Ошибка проверки: CVC-elt.1: Не удается найти объявление элемента 'replyMessage.

ответ

5

Ваш XML является недействительным, так как он не в пространстве имен, требуемой схеме:

targetNamespace="urn:schemas-cybersource-com:transaction-data-1.53" 

Вы должны изменить открывающий тег корневого элемента:

<replyMessage xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
       xmlns="urn:schemas-cybersource-com:transaction-data-1.53"> 
Смежные вопросы