2013-08-21 5 views
2

Я видел несколько вопросов, связанных с разбором xmls, используя woodstox и JAXB, чтобы развязать с помощью XMLStreamReader и проверить на соответствие схемам. Чтение, хотя они не помогли. Мне нужно проверять входящий XML-адрес с локальным DTD и анализировать все содержимое в представлении объекта. Входящий xml может иметь DOCTYPE, который включает DTD. Это нужно пропустить, и вместо этого необходимо использовать локальное DTD. Реализация должна быть очень быстрой. Ожидаемый < 1 мс для проверки и разбора. Я мог бы разобрать один раз, используя следующее за 5 мс. Включение проверки не работает с настройкой схемы (с комментариями строк кода)Проверить и проанализировать xml с помощью woodstox с локальным dtd

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

ответ

3

Есть несколько способов сделать это; и лучший способ получить ответ с большей глубиной - попросить об этом в списке пользователей Woodstox (см. http://xircles.codehaus.org/projects/woodstox/lists).

Следует отметить, что JAXB ничего не знает о Stax2 (расширение Woodstox/Aalto над базовым Stax), поэтому вам нужно получить к нему доступ через API Stax2, а не JAXB. Таким образом, для того, чтобы «внешняя» проверка, вам необходимо позвонить:

xmlStreamReader2.validateAgainst(schemaFromDTD); 

и вы можете сделать это сразу после построения чтения потока (требуется приведение к XMLStreamReader2, или по крайней мере Validatable). Обратите внимание, что при чтении ИЛИ записи вы можете проверить, как работают аналогично (в последнем случае вы включите его через XMLStreamWriter).

Другая возможность заключается в определении XMLResolver собственности (см. XMLInputFactory.RESOLVER). Он вызывается при попытке прочитать внешний dtd, то есть когда DOCTYPE содержит ссылку на внешний файл. Пользовательский XMLResolver может перенаправить это чтение, чтобы использовать другой источник.

Обратите внимание, что первый подход (тот, с которого вы начали), скорее всего, более эффективен, так как ему нужно только один раз прочитать и разобрать схему, если вы читаете ее один раз и повторно используете после этого. Валидация сама по себе должна быть быстрой, и если синтаксический анализ занимает 4 миллисекунды, не должен занимать более 1 миллисекунды; особенно если вы включаете обработку JAXB за 4 миллисекунды (это техническая привязка данных, более высокий уровень анализа).

+0

Благодарим за указатель. Попробует список пользователей. Получение времени проверки и разбора до <1 мс кажется практически нецелесообразным. – Ajay

+0

Зависит от размера контента; синтаксический анализ XML может производиться со скоростью 10-40 мегабайт в секунду, в зависимости от парсера. Таким образом, в 1 мс должен быть способен делать документы 10-40 кБ. Но накладные расходы JAXB более проблематичны. Также убедитесь, что ВСЕГДА повторно используйте 'XMLInputFactory' – StaxMan

+0

Хмм, что дает надежду попробовать. Я поделюсь своими выводами, если мне удастся проверить и проанализировать ожидаемые промежутки времени. Кроме того, когда вы говорите, что синтаксический анализ на 1 мс возможен, ожидайте его разбора всего контента, а не только интересующего вас раздела. – Ajay