2016-11-23 2 views
0

Я использую StAX Iterator api для чтения xml.Как получить весь текст объекта StAX XMLEvent?

XML:

<FormData OID="QUAL"> 
    <IGData IGRepeatKey="1" IGOID="SQUAL" TType="Insert"> 
     <IData Value="0859" IOID="SID"></IData> 
     <IData Value="DM" IOID="RDOMAIN"></IData> 
    </IGData> 
    <IGData IGRepeatKey="1" IGOID="SQUAL" TType="Insert"> 
     <IData Value="0860" IOID="SID"></IData> 
     <IData Value="2013-01-03T02:00" IOID="QVAL"></IData> 
    </IGData> 
</FormData> 

И Stax код:

while(xmlEventReader.hasNext()){ 
    xmlEvent = xmlEventReader.nextEvent(); 
    eventString = xmlEvent.toString(); 
    if(xmlEvent.isStartElement() && eventString.contains("FormData") && eventString.contains("QUAL")){ 
     //do something 
    } 

}

Он работает (eventString имеет весь текст XMLEvent) в моей местной среде.

Но когда я развертываю это на сервере, eventString содержит как «событие Stax # 1». Поэтому, если условие возвращает false.

Я думал, что оба используют различные реализации XMLEvent. Поэтому я проверил его с помощью кода, а jar - в обеих средах: jre1.8.0_73/lib/rt.jar! /javax/xml/stream/events/XMLEvent.class

Как получить весь текст XMLEvent объект? Я делаю что-то неправильно здесь? Пожалуйста, предложите любые другие альтернативы.

+0

В API-интерфейсе Stax нет ничего, что указывало бы, что должна возвращать toString. Поэтому вы никогда не должны кодировать это. Фактическая реализация Stax выбирается во время выполнения в зависимости от многих факторов (система env, порядок загрузчиков классов, которые отличаются JSE et JEE, наличие файлов META-INF ...). Вы можете прочитать это, но не рассчитывайте, что присутствуют только те же самые банки. Вы должны больше узнать о API XMLEvent, следуйте руководству, оно НЕ сделано для того, что вы здесь делаете, например. начиная с заданного узла и распечатывая содержимое этого узла. Это выполнимо, но сложно. – GPI

+0

@GPI, как я могу прочитать содержимое узла? – Hello

+0

@ GPI Почему он работает в локальной среде? любая идея – Hello

ответ

1

Каждый XML событие имеет 3 состояния

  1. Start Element
  2. является Персонажи
  3. End Element

для, например, если вам необходимо получить доступ к данным для "IGRepeatKey" из вашего xml-файла, а затем в состоянии (Start Element), вам нужно проверить, запущен ли тег IGData, если это правда. Начните новый Iterator, который будет перебирать все теги i.e IGRepeatKey, IGOID, TType.

попробовать что-то вроде этого

Iterator<Attribute> iterator = element.getAttributes(); 
while (iterator.hasNext()) 
{ 
    Attribute attribute = (Attribute)iterator.next(); 
    QName name = attribute.getName(); 
    String value = attribute.getValue(); 
    System.out.println(name+" + "+value); 
} 

Добавить этот итератор в xml.isStartElement() блока.

Смежные вопросы