Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用StatxSource验证架构时出现命名空间错误_Java_Xml_Validation_Stax - Fatal编程技术网

Java 使用StatxSource验证架构时出现命名空间错误

Java 使用StatxSource验证架构时出现命名空间错误,java,xml,validation,stax,Java,Xml,Validation,Stax,我尝试使用StAX和javax Validator验证XML,但是我得到以下cast错误: 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.ClassCastExcepti

我尝试使用StAX和javax Validator验证XML,但是我得到以下cast错误:

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.statxevent2sax的强制转换异常,第341行,其中有一个通过迭代器的循环和对字符串的强制转换,而实际上迭代器的类型为NamespaceEventImpl(下面代码部分的代码片段)

以下是执行我所指逻辑时迭代器“i”的内容:

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

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);
    }
}
我想知道以前是否有人遇到过这个问题,以及这是否是在验证器本身中使用StatxSource的一个限制

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);
    }
}