使用StAXSource验证模式时发生命名空间错误

时间:2017-05-23 17:15:27

标签: java xml validation stax

我尝试使用StAX和javax Validator验证XML但是我收到了以下强制转换错误:

org.xml.sax.SAXException: java.lang.ClassCastException: org.codehaus.stax2.ri.evt.NamespaceEventImpl cannot be cast to java.lang.String
javax.xml.transform.TransformerException: java.lang.ClassCastException: org.codehaus.stax2.ri.evt.NamespaceEventImpl cannot be cast to java.lang.String

基本思想是我需要使用StAX解析XML,并尝试重用我将用于解析和创建StAXSource以执行验证的事件阅读器。

我能够调试错误并将强制转换异常跟踪到类com.sun.org.apache.xalan.internal.xsltc.trax.StAXEvent2SAX,第341行,其中有一个循环通过迭代器和一个转换器实际上迭代器的类型为NamespaceEventImpl(下面代码部分的代码片段),实际上是一个String。

        // end namespace bindings
        for( Iterator i = event.getNamespaces(); i.hasNext();) {
            String prefix = (String)i.next();
            if( prefix == null ) { // true for default namespace
                prefix = "";
            }
            _sax.endPrefixMapping(prefix);
        }

以下是迭代器的内容" i"在执行逻辑时,我指的是: iterator content

下面是一段代码,描述了我是如何做到的。

public void validateRequest(RequestMessage message) {
    try {
        XMLInputFactory factory = XMLInputFactory.newInstance();
        XMLEventReader eventReader = factory.createXMLEventReader(new ByteArrayInputStream(message.getMessage().getBytes()));

        this.validateSchema(eventReader);

        if(this.isSchemaValid()) {
            // parse through XML
        }
    } catch(Exception e) {
        LOGGER.error(e.getMessage(), e);
    }
}

private void validateSchema(XMLEventReader eventReader) {
    try {
        StAXErrorHandler errorHandler = new StAXErrorHandler();
        this.validator.setErrorHandler(errorHandler);
        this.validator.validate(new StAXSource(eventReader));
    } catch (SAXException | IOException | XMLStreamException e) {
        LOGGER.error(e.getMessage(), e);
    }
}

我想知道之前是否有人遇到此问题,以及是否将StAXSource与Validator本身一起使用是有限制的。

0 个答案:

没有答案