我可以从SAXParseException和XMLStreamReader

时间:2016-02-02 22:15:57

标签: java validation xsd xml-parsing saxparser

我使用默认的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是无效字段。但是什么是无效的价值我无法推断出这一点。

有没有人工作或遇到类似的情况。

1 个答案:

答案 0 :(得分:0)

我已经测试了您的代码并且它提供了一个完整的错误消息,包括无效的值。

error的{​​{1}}方法被调用两次,并保留BasicErrorHandler以及以下消息:

  

cvc-datatype-valid.1.2.1:'asdfasdf'不是'date'的有效值。

  

cvc-type.3.1.3:元素'startDate'的值'asdfasdf'无效。

无法将无效值设为SAXParseException。因为当触发错误并且SAX仅向前解析时,String的位置超出了文本元素(事件类型为reader)。