Java 使用StatxSource验证架构时出现命名空间错误
我尝试使用StAX和javax Validator验证XML,但是我得到以下cast错误: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
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);
}
}