2014-09-13 5 views
0

Salut,L'analyse de Stax ne retourne pas la bonne réponse

Je suis confronté à un problème très étrange lors de l'analyse de réponse SOAP avec Jaxb. Je ne suis pas en mesure d'obtenir la liste complète des balises lors de l'analyse syntaxique .Stax parser est en mesure d'analyser une seule balise, ce qui ne donne aucune erreur ou exception.Cependant, si j'essaie de formater la réponse xml (qui est stockée dans la chaîne) bien. Voici ce que je fais pour l'analyser: -

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

Voici différents cas d'utilisation du problème: -

  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 

Répondre

0

Je tourne que principal coupable était absent état d'autre. Le curseur d'analyse a pu trouver le premier bloc de ..tag mais une fois que c'est fait, xsr.next est également exécuté à chaque itération. Donc, si xml n'est pas formaté: - 1. Parser trouve le premier bloc complet de et le stocke dans la liste, maintenant le curseur est à la balise suivante mais avant que le contrôle passe à l'itération suivante xsr.next est exécuté et déplace le curseur sur la prochaine balise immédiate.

En cas de données XML au format: - 1. Il y aura \ n caractère entre deux \ bloc continu n même si xsr.next est exécuté à chaque itération il va juste manger \ n caractère et curseur sera droite sur la bonne voie pour analyser le prochain bloc d'étiquette.

Voici le code mis à jour avec état autre: -

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