【问题标题】:Can I get additional information about the error from SAXParseException and XMLStreamReader我可以从 SAXParseException 和 XMLStreamReader 获得有关错误的其他信息吗
【发布时间】:2016-05-11 22:17:11
【问题描述】:

我使用默认的 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));

这是错误处理程序:

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() 来获取无效的节点 但是我尝试了阅读器上的所有方法,但无法获得导致此异常的值。例如 id 我有一个标签为

<startDate>asdfasdf</startDate>

这是根据架构 (XSD) 的日期字段 从上面的代码中,我可以找到节点,即我可以发现 startDate 是无效字段。但是什么是无效的价值我无法推断出来。

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

【问题讨论】:

    标签: java validation xsd xml-parsing saxparser


    【解决方案1】:

    我已经测试了你的代码,它给出了一个完整的错误消息,包括无效的值。

    BasicErrorHandlererror 方法被调用了两次,并持有一个带有以下消息的 SAXParseException

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

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

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

    【讨论】:

    • 但这不是得到我假设的错误的最佳方法。因为它们存在于模糊的字符串中。他们明天可能会有所不同。但是 reader.getLocalName() 准确地返回 fieldName 我想要类似于字段 Value 的东西
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-01-27
    • 1970-01-01
    • 1970-01-01
    • 2023-03-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多