JAXB Validator不检测语法错误?

时间:2014-08-30 08:46:37

标签: java xml validation jaxb

我想在解组之前用xsd验证xml文件。

代码如下:

SchemaFactory factory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
Schema schema = factory.newSchema(xsdFilePath);
Validator validator = schema.newValidator();
validator.setErrorHandler(new MyValidationErrorHandler());
validator.validate(new StreamSource(xmlFilePath));

我发现当xml元素没有关闭时,Validator无法将其记录为错误,但是UnMarshaller会识别出这一点并抛出一个"从元素开始发现无效内容。"错误。

我希望Validation和Unmarshalling / Marshalling是不同的操作。

有没有办法让Validator在xml文件中检测到这样的语法错误?

1 个答案:

答案 0 :(得分:1)

你必须区分两件事:

  1. XML文档的基本语法
  2. 该文档符合XML SChema
  3. 如果基本语法不正确,则没有可以针对其元素结构进行调查的文档,归因于存在,值与facet的符合性等等。

    我担心你必须抓住两种例外情况。

    但是,您可以在单个解组操作中处理所有内容:

    JAXBContext payloadContext = JAXBContext.newInstance("generated");
    Unmarshaller unmarshaller = payloadContext.createUnmarshaller();
    unmarshaller.setSchema(schemaFactory.newSchema(... )););
    unmarshaller.setEventHandler( new ValidationEventHandler(){
        public boolean handleEvent(ValidationEvent event) {
                System.out.println( "Event! " + event );
                return true;
        }
    } );
    

    <强>后来

    要进行验证,您仍然需要解析,但如果您没有JAXB-ish类,那么您可以使用JAXP:

    static class Handler implements ErrorHandler {
      public void error(SAXParseException exception){
        System.out.println( "error: " + exception.getMessage() );
      }
      public void fatalError(SAXParseException exception){
        System.out.println( "fatal: " + exception.getMessage() );
      }
      public void warning(SAXParseException exception){
        System.out.println( "warning: " + exception.getMessage() );
      }
    }
    
    Handler handler = new Handler();
    DocumentBuilder parser = DocumentBuilderFactory.newInstance().newDocumentBuilder();
    parser.setErrorHandler( handler );
    try {
        Document document = parser.parse(new File("test.xml"));
        SchemaFactory factory =
          SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
        Source schemaFile = new StreamSource(new File("test.xsd"));
        Schema schema = factory.newSchema(schemaFile);
        Validator validator = schema.newValidator();
        validator.setErrorHandler( handler );
        try {
          validator.validate(new DOMSource(document));
        } catch (SAXException e) {
          // ...
          System.out.println( "VAlidation error" );
        }
    } catch (SAXParseException e) {
        // syntax error in XML document     
        System.out.println( "Syntax error" );
    }
    

    对于验证,设置处理程序不会抛出ParseException,因此其中一个是多余的。