2014-09-13 2 views
0

Hi,Синтаксический анализ не возвращает правильный ответ

Я столкнулся с очень странной проблемой при разборе SOAP Response с Jaxb. Я не могу получить полный список тегов при разборе. Синтаксический анализатор .Stax способен анализировать только один тег, не выдавая никаких ошибок или исключений. Однако, если я попытаюсь отформатировать ответ xml (который хранится в строке) Все работает отлично хорошо. Вот то, что я делаю, чтобы разобрать его: -

public void parseResponse(){ 
    String response="<SOAP:Body><response><result><myTag></myTag><myTag></myTag>/result</response</SOAP:Body>"; 

    getUnmarshalledObject(response,myTag,MyTag.class,"com.mylearning.parseXml"); 
    } 





    public <T> List<T> getUnmarshalledObject(String response ,String TAG_TO_SEARCH ,Class<T> clazz , String basePkg) 
            throws XMLStreamException, JAXBException{ 
          Reader reader = new StringReader(response); 
          XMLInputFactory xif = XMLInputFactory.newInstance(); 
          XMLStreamReader xsr = xif.createXMLStreamReader(reader); 

          List<T> listOfUnmarshalledObjects = new ArrayList<T>(); 
          while (xsr.hasNext()) { 
           if (xsr.getEventType() == XMLStreamReader.START_ELEMENT && TAG_TO_SEARCH.equals(xsr.getLocalName())) { 
             T unmarshalledObj = unmarshalXml(clazz ,xsr, basePkg); 
             listOfUnmarshalledObjects .add(unmarshalledObj); 
            } 
            xsr.next(); 
           } 
          return listOfUnmarshalledObjects; 
         } 

Вот различные варианты использования этой проблемы: -

  Case 1:- Input String response is unformatted. 
      Result :- listOfUnmarshalledObjects is 1. 

      Case 2:- Format response with response.replaceAll("><",">\n<"); 
      Result:- listOfUnmarshalledObjects is 2. 

      Case 3 : Input String unformatted , just give space b/w </myTag><myTag> 
      Result: listOfUnmarshalledObjects is 2. 

      I tried my best to explain the question, please help me.      
      > Blockquote 

ответ

0

Я оказывается, что главный виновник не хватало еще состояние. Parsing cursor смог найти первый блок из ... tag, но как только это будет сделано с ним, xsr.next также будет выполняться на каждой итерации.

Итак, если xml не отформатирован: - 1. Parser находит первый полный блок и сохраняет его в списке, теперь курсор находится на следующем теге, но до того, как управление переходит к следующей итерации xsr.next выполняется и перемещает курсор на следующий немедленный тег.

В случае форматированного XML: - 1. Там будет \ п характера между двумя непрерывными блоками \ п, так что даже если xsr.next запускается на выполнение при каждой итерации это будет просто есть \ п символы и курсор будет правильно на пути для разбора следующего блока тега.

Вот обновленный код с еще условия: -

while (xsr.hasNext()) { 
    if (xsr.getEventType() == XMLStreamReader.START_ELEMENT && TAG_TO_SEARCH.equals(xsr.getLocalName())) { 
      T unmarshalledObj = unmarshalXml(clazz ,xsr, basePkg); 
      listOfUnmarshalledObjects .add(unmarshalledObj); 
     }else{ 
      xsr.next(); 
      } 
    } 
Смежные вопросы