Autore Topic: Pulizia Risposta xml ricevuta da chiamata SOAP  (Letto 937 volte)

Offline dom4

  • Utente normale
  • ***
  • Post: 158
  • Respect: +1
    • Mostra profilo
  • Dispositivo Android:
    Vodafone Ideos, Nexus 5
Pulizia Risposta xml ricevuta da chiamata SOAP
« il: 25 Maggio 2011, 10:10:31 CEST »
0
Buongiorno,sto effettuando una chiamata ad un webserver tramite ksoap,la chiamata va a buon fine,il problema ora è la pulizia della stringa che ricevo.Ho bisogno di sistemarla e memorizzare dei dati che dovrò usare in una seconda activity.Ho scritto un parser utilizzando xmlPullParser:

Codice (Java): [Seleziona]
public class ProdottiConcorsoHandler {

        private ArrayList<ProdottoConcorsiPortale> L;
        private StringReader xmlResponse;
       
        public ProdottiConcorsoHandler(String xml)
        {
                xmlResponse = new StringReader(xml);
               
        }
       
        public ArrayList<ProdottoConcorsiPortale> parse() throws IOException,XmlPullParserException
        {
                XmlPullParser parser = Xml.newPullParser();
               
         try{  
                 Log.i("ProdottiHandler","Sono nel try");
                parser.setInput(xmlResponse);
                Log.i("SetInput","xmlResponse");
               
                ProdottoConcorsiPortale currentProdotto = null;
                  int eventType = parser.getEventType();
                  Log.i("eventType","get" + parser.getEventType());
                    while(eventType != XmlPullParser.END_DOCUMENT)
                     {
                        String nomeNodo;
                          switch(eventType)
                           {
                          case XmlPullParser.START_DOCUMENT :
                                  L = new ArrayList<ProdottoConcorsiPortale>();
                              break;
                          case XmlPullParser.START_TAG :
                                  nomeNodo = parser.getName();
                                   if(nomeNodo.equalsIgnoreCase("soap:Envelope"))
                                    {
                                           Log.i("1","Aperto tag Envelope");
                                    }
                                   else if(nomeNodo.equalsIgnoreCase("soap:Body"))
                                    {
                                           Log.i("2","Aperto tag Body");
                                    }
                                   else if(nomeNodo.equalsIgnoreCase("GetProdottiConcorsoResponse"))
                                    {
                                           Log.i("3","Aperto tag GetProdottiConcorsoResponse");  
                                    }
                                   else if(nomeNodo.equalsIgnoreCase("GetProdottiConcorsoResult"))
                                    {
                                           Log.i("4","Aperto tag GetProdottiConcorsoResult");  
                                    }
                                   else if(nomeNodo.equalsIgnoreCase("ProdottoConcorsiPortale"))
                                    {
                                           currentProdotto = new ProdottoConcorsiPortale();
                                           Log.i("5","Aperto tag ProdottoConcorsiPortale");  
                                    }
                                   else if(nomeNodo.equalsIgnoreCase("ID"))
                                    {
                                           currentProdotto.setId(Integer.parseInt(parser.nextText()));
                                           Log.i("6","Aperto tad ID");
                                    }
                                   else if(nomeNodo.equalsIgnoreCase("Descrizione"))
                                    {
                                            Log.i("7","Aperto tag Descrizione");
                                        currentProdotto.setDescrizione(parser.nextText());
                                    }
                                   else if(nomeNodo.equalsIgnoreCase("QuantitàMinima"))
                                   {
                                           Log.i("8","Aperto tag Quantità Minima");
                                           currentProdotto.setQuantitaMinima(Double.parseDouble(parser.nextText()));
                                   }
                                   else if(nomeNodo.equalsIgnoreCase("ID_CONCORSO"))
                                   {
                                           Log.i("9","Aperto tag ID_CONCORSO");
                                            currentProdotto.setID_CONCORSO(Integer.parseInt(parser.nextText()));
                                   }
                                   break;
                          case XmlPullParser.END_TAG :
                                  nomeNodo = parser.getName();
                                   if(nomeNodo.equalsIgnoreCase("ProdottoConcorsiPortale"))
                                   {
                                           L.add(currentProdotto);
                                           
                                   }
                                   break;
                           }
                          eventType = parser.next();
                     }
          }catch(IOException e)
            {
                  Log.i("Errore","" + e.toString());
            }
           catch(XmlPullParserException e)
            {
                   Log.i("Errore","" + e.toString());  
            }
                   return L;
        }
       
}
L'errore che ricevo è il seguente:


05-25 07:18:47.795: INFO/Errore(360): org.xmlpull.v1.XmlPullParserException: Error parsing document. (position:line -1, column -1) caused by: org.apache.harmony.xml.ExpatParser$ParseException: At line 1, column 27: not well-formed (invalid token)

è chiaro che non leggo bene la risposta ricevuta.
Ho allegato la risposta così come mi arriva a schermo e la risposta ottenuta con il comando: androidHttpTransport.responseDump
Qualche suggerimento?
« Ultima modifica: 25 Maggio 2011, 10:38:29 CEST da dom4 »

Offline MarcoDuff

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 1073
  • Respect: +202
    • Google+
    • marcoduff
    • Mostra profilo
    • MarcoDuff's Blog
  • Dispositivo Android:
    Samsung Galaxy Nexus
  • Play Store ID:
    MarcoDuff
  • Sistema operativo:
    Windows 7
Re:Pulizia Risposta xml ricevuta da chiamata SOAP
« Risposta #1 il: 25 Maggio 2011, 10:20:24 CEST »
0
Potresti includere il codice tra i tag "code=java" e "/code".
Grazie.

Offline dom4

  • Utente normale
  • ***
  • Post: 158
  • Respect: +1
    • Mostra profilo
  • Dispositivo Android:
    Vodafone Ideos, Nexus 5
Re:Pulizia Risposta xml ricevuta da chiamata SOAP
« Risposta #2 il: 25 Maggio 2011, 10:30:47 CEST »
0
Potresti includere il codice tra i tag "code=java" e "/code".
Grazie.

Dove doverbbe essere questo tag "code=java"?Nella risposta xml?

Offline MarcoDuff

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 1073
  • Respect: +202
    • Google+
    • marcoduff
    • Mostra profilo
    • MarcoDuff's Blog
  • Dispositivo Android:
    Samsung Galaxy Nexus
  • Play Store ID:
    MarcoDuff
  • Sistema operativo:
    Windows 7
Re:Pulizia Risposta xml ricevuta da chiamata SOAP
« Risposta #3 il: 25 Maggio 2011, 10:35:49 CEST »
0
No, parlo di come hai scritto il tuo post.

Per formattare il codice in modo leggibile, dovresti includerlo tra quei tag.

Quindi edita il tuo primo post e usa il pulsante per formattare meglio il post.

Grazie.

Offline dom4

  • Utente normale
  • ***
  • Post: 158
  • Respect: +1
    • Mostra profilo
  • Dispositivo Android:
    Vodafone Ideos, Nexus 5
Re:Pulizia Risposta xml ricevuta da chiamata SOAP
« Risposta #4 il: 25 Maggio 2011, 10:42:19 CEST »
0
Ho modificato questa parte del codice aggiungengo un Log.i() nel while.Parte un loop infinito mi stampa sempre "Sono nel while","eventType != end_document",e eventType risulta essere uguale a 0.
Codice (Java): [Seleziona]
 int eventType = parser.getEventType();
                  Log.i("eventType","get" + parser.getEventType());
                    while(eventType != XmlPullParser.END_DOCUMENT)
                        Log.i("Sono nel while","eventType != end_document");

Offline MarcoDuff

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 1073
  • Respect: +202
    • Google+
    • marcoduff
    • Mostra profilo
    • MarcoDuff's Blog
  • Dispositivo Android:
    Samsung Galaxy Nexus
  • Play Store ID:
    MarcoDuff
  • Sistema operativo:
    Windows 7
Re:Pulizia Risposta xml ricevuta da chiamata SOAP
« Risposta #5 il: 25 Maggio 2011, 10:49:14 CEST »
0
Nel tuo ultimo codice ti sei dimenticato le graffe dopo il while (e non fai il parser.next()) quindi è ovvio che vai in un ciclo infinito.

Cambia quella parte e riprova.

In ogni caso, l'errore mi puzza di codice xml non valido (quindi un errore del server e non del tuo codice). Hai provato con un altro xml di prova?

Offline Ricky`

  • Amministratore
  • Utente storico
  • *****
  • Post: 3489
  • Respect: +506
    • Github
    • Google+
    • rciovati
    • Mostra profilo
Re:Pulizia Risposta xml ricevuta da chiamata SOAP
« Risposta #6 il: 25 Maggio 2011, 10:51:10 CEST »
0
Dai un occhio a questo link:

Working with XML on Android

C'è un esempio di XmlPullParser.
Lui utilizza due condizioni per uscire dal ciclo, magari può esserti d'aiuto prendere spunto :)

Offline dom4

  • Utente normale
  • ***
  • Post: 158
  • Respect: +1
    • Mostra profilo
  • Dispositivo Android:
    Vodafone Ideos, Nexus 5
Re:Pulizia Risposta xml ricevuta da chiamata SOAP
« Risposta #7 il: 25 Maggio 2011, 11:46:31 CEST »
0
Nel tuo ultimo codice ti sei dimenticato le graffe dopo il while (e non fai il parser.next()) quindi è ovvio che vai in un ciclo infinito.

Cambia quella parte e riprova.

In ogni caso, l'errore mi puzza di codice xml non valido (quindi un errore del server e non del tuo codice). Hai provato con un altro xml di prova?

Le graffe non mancano altrimenti mi avrebbe segnalato un'errore,io faccio la lettura di

eventType = parser.next();

tra la chiusura dello switch e la chiusura del while.è lì che va fatto oppure no?

Dai un occhio a questo link:

Working with XML on Android

C'è un esempio di XmlPullParser.
Lui utilizza due condizioni per uscire dal ciclo, magari può esserti d'aiuto prendere spunto :)

Conosco quel tutorial,ma grazie lo stesso per avermelo segnalato,lo guarderò con più attenzione,forse c'è qualcosa che mi sfugge.

Offline dom4

  • Utente normale
  • ***
  • Post: 158
  • Respect: +1
    • Mostra profilo
  • Dispositivo Android:
    Vodafone Ideos, Nexus 5
Re:Pulizia Risposta xml ricevuta da chiamata SOAP
« Risposta #8 il: 25 Maggio 2011, 17:29:59 CEST »
0
Scrivendo un altro parser l'errore restituito è sempre lo stesso,riga 1 colonna 27,praticamente questa linea:
<?xml version="1.0" encoding="utf-8"?>

Il problema dovrebbe essere l'encoding.Sto guardando un pò su google,ma non ho trovato alcuna soluzione.

Offline MarcoDuff

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 1073
  • Respect: +202
    • Google+
    • marcoduff
    • Mostra profilo
    • MarcoDuff's Blog
  • Dispositivo Android:
    Samsung Galaxy Nexus
  • Play Store ID:
    MarcoDuff
  • Sistema operativo:
    Windows 7
Re:Pulizia Risposta xml ricevuta da chiamata SOAP
« Risposta #9 il: 25 Maggio 2011, 17:40:10 CEST »
0
Puoi pubblicare l'xml che stai tentando di leggere?

Offline dom4

  • Utente normale
  • ***
  • Post: 158
  • Respect: +1
    • Mostra profilo
  • Dispositivo Android:
    Vodafone Ideos, Nexus 5
Re:Pulizia Risposta xml ricevuta da chiamata SOAP
« Risposta #10 il: 25 Maggio 2011, 17:45:43 CEST »
0
Codice (XML): [Seleziona]
<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<soap:Body>
<GetProdottiConcorsoResponse xmlns="http://tempuri.org/">
 <GetProdottiConcorsoResult>
  <ProdottoConcorsiPortale>
   <ID>2</ID>
   <Descrizione>caffè</Descrizione>
   <QuantitaMinima>0</QuantitaMinima>
   <ID_Concorso>0</ID_Concorso>
  </ProdottoConcorsiPortale>
   <ProdottoConcorsiPortale>
   <ID>1</ID>
   <Descrizione>pizza</Descrizione>
   <QuantitaMinima>0</QuantitaMinima>
   <ID_Concorso>0</ID_Concorso>
  </ProdottoConcorsiPortale>
</GetProdottiConcorsoResult>
</GetProdottiConcorsoResponse>
</soap:Body>
</soap:Envelope>

E' la risposta che ottengo da una chiamata ad un ws effettuata con Ksoap

Offline dom4

  • Utente normale
  • ***
  • Post: 158
  • Respect: +1
    • Mostra profilo
  • Dispositivo Android:
    Vodafone Ideos, Nexus 5
Re:Pulizia Risposta xml ricevuta da chiamata SOAP
« Risposta #11 il: 27 Maggio 2011, 09:47:21 CEST »
0
Ho eliminato il problema dell'errore,dichiarando meglio il parser:
Codice (Java): [Seleziona]
XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
XmlPullParser parser1 =factory.newPullParser();

Utilizzando
Codice (Java): [Seleziona]
parser1.getEventType(); viene restituito valore 0 che corrisponde a START_DOCUMENT,quindi va bene,il problema è che fa un ciclo del while,e poi mi ritorna un valore di getEventType = 4 e non legge nulla.Come mai??

Offline dom4

  • Utente normale
  • ***
  • Post: 158
  • Respect: +1
    • Mostra profilo
  • Dispositivo Android:
    Vodafone Ideos, Nexus 5
Re:Pulizia Risposta xml ricevuta da chiamata SOAP
« Risposta #12 il: 31 Maggio 2011, 09:56:21 CEST »
0
Utilizzando
Codice (Java): [Seleziona]
parser1.getEventType(); viene restituito valore 0 che corrisponde a START_DOCUMENT,quindi va bene,il problema è che fa un ciclo del while,e poi mi ritorna un valore di getEventType = 4 e non legge nulla.Come mai??
[/quote]

Approfondendo lo studio della documentazione di XmlPullParser getEventType = 4 corrisponde a TEXT,cioè viene letta la stringa passata al parser, e che io dovrei leggere con getText()
La cosa strana è che io già faccio un controllo su eventType = 0,il quale dovrebbe stamparmi che è all'inizio del documento ed invece questo non succede.