码迷,mamicode.com
首页 > 编程语言 > 详细

cvc-elt.1: Cannot find the declaration of element---与spring 无关的schema 验证失败

时间:2015-03-18 01:05:32      阅读:238      评论:0      收藏:0      [点我收藏+]

标签:

  晚上查了好久,都是spring 出这种问题的解决方式,终于查到为什么了。

 

http://wakan.blog.51cto.com/59583/7218/   转自这个人。。 多谢啦!

为了验证 XML 文档的合法性,通常需要对文档进行验证,要么符合 DTD,要么符合 Schema。在以前的 JAXP 版本中,验证(Validation)是作为解析器(Parser)的一个功能特征来提供的。

  JAXP 的 Validation API 把 XML Parser 和 Validator 解耦合了。这样获得了两个好处:
  
  1、支持更多的 Schema 语言
  
  2、在运行时 XML 与 Schema 更容易耦合在一起
  
  以下是一个小例程,演示了用 Validation API 验证 XML 文件是否符合 Schema:
  
  import java.io.*;
  import javax.xml.*;
  import org.w3c.dom.*;
  import javax.xml.parsers.*;
  import javax.xml.validation.*;
  import javax.xml.transform.dom.*;
  import javax.xml.transform.stream.*;
  
  public class TestMain {
  
    public static void main(String[] args) {
    try {
      String strLang = XMLConstants.W3C_XML_SCHEMA_NS_URI;
      SchemaFactory factory = SchemaFactory.newInstance(strLang);
  
      InputStream isSchema = ClassLoader.getSystemClassLoader()
        .getResourceAsStream("personal.xsd");
      StreamSource ss = new StreamSource(isSchema);
      Schema schema = factory.newSchema(ss);
  
      Validator validator = schema.newValidator();
  
      DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
      dbf.setNamespaceAware(true);
      DocumentBuilder db = dbf.newDocumentBuilder();
  
      InputStream isXML = ClassLoader.getSystemClassLoader()
        .getResourceAsStream("personal-schema.xml");
      Document document = db.parse(isXML);
  
      DOMSource source = new DOMSource(document);
      validator.validate(source);
      System.out.println("Result : Valid!");
  
    } catch (Exception e) {
      e.printStackTrace();
      System.out.println("Result : Invalid!");
    }
    }
  }

  运行环境:JDK 1.4.2 + Xerces 2.8.0 for Java。

  有一个小地方要注意,如果用的是 DOMSource,程序中必须加上:dbf.setNamespaceAware(true);   
  否则会出错,找不到根节点元素的定义,例如:
  
  org.xml.sax.SAXParseException: cvc-elt.1: Cannot find the declaration of element ‘personnel‘.
    at org.apache.xerces.util.ErrorHandlerWrapper.createSAXParseException(Unknown Source)
    at org.apache.xerces.util.ErrorHandlerWrapper.error(Unknown Source)
    at org.apache.xerces.impl.XMLErrorReporter.reportError(Unknown Source)
    at org.apache.xerces.impl.XMLErrorReporter.reportError(Unknown Source)
    at org.apache.xerces.impl.xs.XMLSchemaValidator.handleStartElement(Unknown Source)
    at org.apache.xerces.impl.xs.XMLSchemaValidator.startElement(Unknown Source)
    at org.apache.xerces.jaxp.validation.DOMValidatorHelper.beginNode(Unknown Source)
    at org.apache.xerces.jaxp.validation.DOMValidatorHelper.validate(Unknown Source)
    at org.apache.xerces.jaxp.validation.DOMValidatorHelper.validate(Unknown Source)
    at org.apache.xerces.jaxp.validation.ValidatorImpl.validate(Unknown Source)
    at javax.xml.validation.Validator.validate(Unknown Source)
    at TestMain.main(TestMain.java:32)

  当然,如果用的是 StreamSource,就不需要这么费劲了。如下:
  
    ……
    InputStream isXML = ClassLoader.getSystemClassLoader()
    .getResourceAsStream("personal-schema.xml");
    
    /*
    DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
    dbf.setNamespaceAware(true);
    DocumentBuilder db = dbf.newDocumentBuilder();
    Document document = db.parse(isXML);
    DOMSource source = new DOMSource(document);
    */
    
    StreamSource source = new StreamSource(isXML);
    validator.validate(source);
    ……
  
附源代码下载。是一个 Eclipse 工程。为了减少字节数,把 lib 目录下 Xerces 2.8.0 for Java 的 Jar 包删除掉了。下载后,请自行加上:xml-apis.jar 和 xercesImpl.jar。

  

cvc-elt.1: Cannot find the declaration of element---与spring 无关的schema 验证失败

标签:

原文地址:http://www.cnblogs.com/IamThat/p/4346014.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!