java - 无法解析 org.xml.sax.SAXParseException : cvc-elt. 1:找不到元素 'soapenv:Envelope' 的声明

标签 java xml xsd

   Below is the code 


import java.io.File;
    import java.io.IOException;
 import javax.xml.XMLConstants;
  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.SAXException;


 public class XMLValidation {

public static void main(String[] args) {

    System.out.println("request.xml validates agains xsd "+validateXMLSchema("request.xsd",  "request.xml"));
  }

public static boolean validateXMLSchema(String xsdPath, String xmlPath){

    try {
        SchemaFactory factory = 
                SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
        Schema schema;
        try {
            schema = factory.newSchema(new File(xsdPath));
             Validator validator = schema.newValidator();
                validator.validate(new StreamSource(new File(xmlPath)));
        } catch (SAXException e) {

            // TODO Auto-generated catch block
            e.printStackTrace();
            return false;
        }

    } 
    catch (IOException e) {
        System.out.println("Exception: "+e.getMessage());

    }
    return true;
}

下面是我在验证请求 xml 和请求 xsd 时遇到的错误:

 org.xml.sax.SAXParseException: cvc-elt.1: Cannot find the declaration of element 'soapenv:Envelope'.
at   com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.createSAXParseException(ErrorHandlerWrapper.java:195)
at com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.error(ErrorHandlerWrapper.java:131)
at com.sun.org.apache.xerces.internal.impl.XMLErrorReporter.reportError(XMLErrorReporter.java:384)
at com.sun.org.apache.xerces.internal.impl.XMLErrorReporter.reportError(XMLErrorReporter.java:318)
at com.sun.org.apache.xerces.internal.impl.xs.XMLSchemaValidator.handleStartElement(XMLSchemaValidator.java:1887)
at com.sun.org.apache.xerces.internal.impl.xs.XMLSchemaValidator.startElement(XMLSchemaValidator.java:685)
at com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl.scanStartElement(XMLNSDocumentScannerImpl.java:400)
at com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl$NSContentDriver.scanRootElementHook(XMLNSDocumentScannerImpl.java:626)
at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl$FragmentContentDriver.next(XMLDocumentFragmentScannerImpl.java:3088)
at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl$PrologDriver.next(XMLDocumentScannerImpl.java:914)
at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.next(XMLDocumentScannerImpl.java:647)
at com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl.next(XMLNSDocumentScannerImpl.java:140)
at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(XMLDocumentFragmentScannerImpl.java:508)
at      com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:807)
at                          com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:737)
at         com.sun.org.apache.xerces.internal.jaxp.validation.StreamValidatorHelper.validate(StreamValidatorHelper.java:144)
at  com.sun.org.apache.xerces.internal.jaxp.validation.ValidatorImpl.validate(ValidatorImpl.java:107)
at javax.xml.validation.Validator.validate(Validator.java:127)
at com.att.xmlvalidation.XMLValidation.validateXMLSchema(XMLValidation.java:35)
at com.att.xmlvalidation.XMLValidation.main(XMLValidation.java:23)

能否请您帮我在我的代码中添加什么,以便在我的 XSD 中添加 我无法在 XSD 中进行任何更改,因为它是标准的,而且 Soap:env 不存在于该请求 XSD 中,但存在于请求 XML 中,因此在验证它时说标签丢失。

最佳答案

你有两个选择:

  1. 在 validator 可用的模式中包含 soap 模式(为了进行模式验证,您必须提供所有相关模式)
  2. 从有效负载中剥离 soap 包装器元素并仅验证有效负载(假设您拥有的架构仅适用于有效负载)。您可以使用引用负载 ElementDOMSource 而不是 StreamSource

关于java - 无法解析 org.xml.sax.SAXParseException : cvc-elt. 1:找不到元素 'soapenv:Envelope' 的声明,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26315437/

相关文章:

java - 在 OpenSSL 中完成的 AES 加密成功解密,但在 Java 中加密时失败

java - 意外的 JUnit 行为

xml - 使用 DTD 我可以指定元素出现的确切数量吗?

java - 为什么要编译 XPath 表达式?

java - 在 HashMap 和 HashTable 中计算 hashCode 的工作方式是否不同?

java - 从等待名单中随机挑选数量的玩家

xml - 使用 xslt 重命名元素

.net - 使用 xsd.exe 从程序集中的类型生成 XSD,在属性上具有数据注释属性

java - 我可以根据 XSD 验证 XML 元素的数据类型、大小写、长度和空检查吗?

xml - 基于另一个属性值限制 XSD 属性值