我想在解组之前用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文件中检测到这样的语法错误?
答案 0 :(得分:1)
你必须区分两件事:
如果基本语法不正确,则没有可以针对其元素结构进行调查的文档,归因于存在,值与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,因此其中一个是多余的。