我看到了多个问题,这些问题涉及使用woodstox和JAXB解析xmls、使用XMLStreamReader解除封送和对schemas.Reading进行验证,尽管它们没有帮助。我需要的是使用本地DTD验证传入的xml,并将整个内容解析为对象表示。传入的xml可以有一个DOCTYPE,其中包含一个DTD。这需要跳过,需要使用本地DTD。实施应该非常迅速。期望< 1ms来进行验证和解析。我可以在5ms中单独使用以下内容进行解析。集成验证不适用于设置模式(注释代码行)
xmlif = XMLInputFactory2.newInstance();
xmlif.setProperty(XMLInputFactory2.SUPPORT_DTD, false);
JAXBContext ucontext;
ucontext = JAXBContext.newInstance(XMLOuterElementClass.class);
unmarshaller = ucontext.createUnmarshaller();
/*SchemaFactory sf = SchemaFactory.newInstance(XMLConstants.XML_DTD_NS_URI);
Schema schema = sf.newSchema(new File("c:/resources/schma.dtd"));
unmarshaller.setSchema(schema);*/
XMLStreamReader xsr = xmlif
.createXMLStreamReader(new StringReader(xml));
//xsr = new StreamReaderDelegate(xsr);
long start = System.currentTimeMillis();
try {
while (xsr.hasNext()) {
if (xsr.isStartElement()
&& xsr.getLocalName() == "XMLOuterElementClass") {
break;
}
xsr.next();
}
JAXBElement<XMLOuterElementClass> jb = unmarshaller.unmarshal(xsr,
XMLOuterElementClass.class);
System.out.println("Total time taken in ms :" + (end - start));
} finally {
xsr.close();
}发布于 2013-08-21 17:02:02
有多种方法可以做到这一点;要获得更深入的答案,最好的方法是在Woodstox用户列表上问这个问题(参见http://xircles.codehaus.org/projects/woodstox/lists)。
但是有一点要注意的是,JAXB对Stax2一无所知(Woodstox/Aalto扩展到basic ),所以您需要通过Stax2 API访问它,而不是JAXB。因此,要启用“外部”验证,需要调用:
xmlStreamReader2.validateAgainst(schemaFromDTD);在构建流读取器(需要转换为XMLStreamReader2,或至少转换到Validatable)之后,您可以立即这样做。请注意,您可以在阅读或写入时验证,两者的工作方式类似(在后一种情况下,您通过XMLStreamWriter启用它)。
另一种可能是定义XMLResolver属性(参见XMLInputFactory.RESOLVER)。当尝试读取外部dtd时,即当DOCTYPE包含对外部文件的引用时,将调用它。然后,自定义XMLResolver可以将此读取重定向到使用其他源。
请注意,第一种方法(您开始使用的方法)可能更有效,因为它只需要读取一次并解析Schema一次,假设您只读取一次,然后再使用它。验证本身应该是快速的,如果解析需要4毫秒,则不应该超过1毫秒;特别是如果您在4毫秒内包含JAXB处理(这是技术上的数据绑定,高于较低层次的解析)。
https://stackoverflow.com/questions/18353595
复制相似问题