2010-06-15 49 views
2

我使用下面的代码来验证XSD模式无法验证针对XSD模式的XML文档(找不到元素“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文件:

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