我使用默认的javax.API.validator来验证针对XSD的XML文件,即SAXParser
SchemaFactory factory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
Schema schema = factory.newSchema(new File(schemaPath));
StreamSource XML = new StreamSource(new File(xmlPath));
XMLStreamReader reader = XMLInputFactory.newFactory().createXMLStreamReader(XML);
Validator validator = schema.newValidator();
validator.setErrorHandler(new BasicErrorHandler(reader));
validator.validate(new StAXSource(reader));
这是ErrorHandler:
public class BasicErrorHandler implements ErrorHandler {
private XMLStreamReader reader;
public BasicErrorHandler(XMLStreamReader reader) {
this.reader = reader;
}
@Override
public void error(SAXParseException e) throws SAXException {
warning(e);
}
@Override
public void fatalError(SAXParseException e) throws SAXException {
warning(e);
}
@Override
public void warning(SAXParseException e) throws SAXException {
System.out.println(reader.getLocalName());
e.printStackTrace(System.out);
}
}
我可以通过调用reader.getLocalName()来获取无效的节点 但是我尝试了阅读器上的所有方法,但是却无法获得导致此异常的值。例如,我有一个标签为
<startDate>asdfasdf</startDate>
是根据架构(XSD)的日期字段 从上面的代码我可以得到节点,即我可以发现startDate是无效字段。但是什么是无效的价值我无法推断出这一点。
有没有人工作或遇到类似的情况。
答案 0 :(得分:0)
我已经测试了您的代码并且它提供了一个完整的错误消息,包括无效的值。
error
的{{1}}方法被调用两次,并保留BasicErrorHandler
以及以下消息:
cvc-datatype-valid.1.2.1:'asdfasdf'不是'date'的有效值。
和
cvc-type.3.1.3:元素'startDate'的值'asdfasdf'无效。
无法将无效值设为SAXParseException
。因为当触发错误并且SAX仅向前解析时,String
的位置超出了文本元素(事件类型为reader
)。