Я видел несколько вопросов, связанных с синтаксическим анализом XML-файлов с использованием woodstox и JAXB для демаршалирования с использованием XMLStreamReader
и проверки по схемам. Чтение их не помогло. Что мне нужно, так это проверить входящий xml с помощью локального DTD и проанализировать все содержимое в объектном представлении. Входящий xml может иметь DOCTYPE, который включает DTD. Это нужно пропустить и вместо этого использовать локальный DTD. Реализация должна быть очень быстрой. Ожидается ‹ 1 мс для проверки и синтаксического анализа. Мне удалось разобрать в одиночку, используя следующее за 5 мс. Включение проверки не работает с настройкой схемы (закомментированные строки кода)
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();
}