Saltar para conteúdo


Foto
- - - - -

Parsing web services with ksoap

ksoap web services parsing

  • Por favor inicie sessão para responder
6 respostas a este tópico

#1 Darky1203

Darky1203

    Novato

  • Membros
  • Pip
  • 8 mensagens
  • Localizaçãomarco de canaveses
  • huawei x3; tablet plaroid mid800 e ipgone 3gs

Mensagem publicada 27 June 2013 - 11:52

Boas minha gente
É o seguinte, estou a receber de um web services um envelope em xml. O problema é que eu quero determinar o que mostrar ao utilizador e isto é que me está a dar dor de cabeça.
Deixo aqui o meu codigo tanto  de java como o que recebo do web service.
 
package com.example.webservice;

import android.util.Log;

import org.ksoap2.SoapEnvelope;
import org.ksoap2.serialization.PropertyInfo;
import org.ksoap2.serialization.SoapObject;
import org.ksoap2.serialization.SoapSerializationEnvelope;
import org.ksoap2.transport.HttpTransportSE;

import java.util.Vector;

public class CallSoap
{
    public final String SOAP_ACTION = "http://tempuri.org/executarSQL";
    public  final String OPERATION_NAME = "executarSQL";
    public  final String WSDL_TARGET_NAMESPACE= "http://tempuri.org/";
    public  final String SOAP_ADDRESS = "http://10.0.2.2:6819/webservice1.asmx";

    public CallSoap()
    {
    }
    public String call(String St)
    {
        String response =null;
        try
        {
            SoapObject request = new SoapObject(WSDL_TARGET_NAMESPACE,OPERATION_NAME);

            St = "select count(*) as resultado from curso";
            String tipo = "1";

            PropertyInfo Stprop =new PropertyInfo();
            Stprop.setName("St");
            Stprop.setValue(St);
            Stprop.setType(String.class);
            request.addProperty(Stprop);

            PropertyInfo tipoprop =new PropertyInfo();
            tipoprop.setName("tipo");
            tipoprop.setValue(tipo);
            tipoprop.setType(int.class);
            request.addProperty(tipoprop);

            SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
            envelope.dotNet = true;
            envelope.setOutputSoapObject(request);
            HttpTransportSE httpTransport = new HttpTransportSE(SOAP_ADDRESS);
            httpTransport.call(SOAP_ACTION, envelope);
            response = String.valueOf(envelope.getResponse());

            Vector<Object> vector = (Vector<Object>) envelope.getResponse();
            Log.d("Response in SOAP", vector.toString());
            parseSoapResponse(vector);
        }
        catch (Exception e)
        {
            e.printStackTrace();
        }
    return response;
    }

        public void parseSoapResponse (Vector<Object> vector)
        {
        for (int i = 0; i < vector.size(); i++) {
            SoapObject object = (SoapObject) vector.get(i);
            if(object != null){
                Log.d("resultado",object.getProperty("resultado").toString());
            }
           System.out.print("resultado"+vector);
        }

    }

}
package com.example.webservice;

import android.app.Activity;
import android.os.Bundle;
import android.app.AlertDialog;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;

public class callfinal extends Activity
{
    public static String rslt ="";    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Button b1=(Button)findViewById(R.id.button1);
        final  AlertDialog ad=new AlertDialog.Builder(this).create();
        b1.setOnClickListener(new OnClickListener() {

            @Override public void onClick(View arg0) {
                try
                {
                    EditText ed2=(EditText)findViewById(R.id.editText2);
                    int b =Integer.parseInt(ed2.getText().toString());
                    rslt="START";
                    caller c=new caller();
                    c.join();
                    c.start();
                    while(rslt=="START")
                    {
                        try
                        {
                            Thread.sleep(10);
                        }
                        catch(Exception ex)
                        {
                        }
                    }

                    ad.setTitle("RESULT");
                    ad.setMessage(rslt);
                }
                catch(Exception ex)
                {
                }
                ad.show();
            } });
    }
}
package com.example.webservice;

public class caller extends Thread
{
    public CallSoap cs;
    public String St;
    public void run(){

        try
        {
            cs=new CallSoap();
            String resp=cs.call(St);

            callfinal.rslt=resp;
        }
        catch(Exception ex)
        {
            callfinal.rslt=ex.toString();
        }
    }
}
<DataTable xmlns="http://tempuri.org/">
<xs:schema xmlns="" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" id="NewDataSet">
<xs:element name="NewDataSet" msdata:IsDataSet="true" msdata:MainDataTable="resultado" msdata:Locale="">
<xs:complexType>
<xs:choice minOccurs="0" maxOccurs="unbounded">
<xs:element name="resultado" msdata:Locale="">
<xs:complexType>
<xs:sequence>
<xs:element name="resultado" type="xs:int" minOccurs="0"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:choice>
</xs:complexType>
</xs:element>
</xs:schema>
<diffgr:diffgram xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" xmlns:diffgr="urn:schemas-microsoft-com:xml-diffgram-v1">
<DocumentElement xmlns="">
<resultado diffgr:id="resultado1" msdata:rowOrder="0">
<resultado>23</resultado>
</resultado>
</DocumentElement>
</diffgr:diffgram>
</DataTable>

Peço desculpa, por tanto codigo, mas é para melhor compreensão de toda a gente. O que eu desejo é que apareça apenas " resultado=23".

Abraço

 



#2 pedronveloso

pedronveloso

    Veloso

  • Administradores
  • 1578 mensagens
  • S8

Mensagem publicada 29 June 2013 - 15:38

Eu nunca usei KSoap, mas no teu caso se o valor que pretender e apenas o conteudo de "resultado" porque nao fazer apenas um String parsing manual? Se fosse necessaria a leitura de propriedades faria sentido usar uma biblioteca para processamento dos dados, mas neste caso so tens mesmo de encontrar o <resultado> e ler o valor.



#3 Darky1203

Darky1203

    Novato

  • Membros
  • Pip
  • 8 mensagens
  • Localizaçãomarco de canaveses
  • huawei x3; tablet plaroid mid800 e ipgone 3gs

Mensagem publicada 01 July 2013 - 01:20

sim mas neste caso por apenas estou a utilizar a instrução slq "select count (*) as resultado from curso" de uma tabela que existe no web service. em que o web service faz me um return table. O meu problema é conseguir imprimir no ecra do android apenas os dados que eu quero, neste caso, resultado=23.

Eu não estou a conseguir é fazer isso. tenho estado a ler o que tu sugeris te mas sem sucesso de melhorias.

 

 

PS: bom livro sobre android, ajudarei com 1,5 € que vou receber do paypal para continuares o livro. 


  • pedronveloso gosta disto

#4 Driver

Driver

    Membro

  • Membros
  • PipPip
  • 51 mensagens

Mensagem publicada 01 July 2013 - 15:05

Já experimentaste com o SoapUI para ver a resposta ?



#5 Darky1203

Darky1203

    Novato

  • Membros
  • Pip
  • 8 mensagens
  • Localizaçãomarco de canaveses
  • huawei x3; tablet plaroid mid800 e ipgone 3gs

Mensagem publicada 01 July 2013 - 16:17

Já experimentaste com o SoapUI para ver a resposta ?

Não, mas podias me explicar como se faz isso se faz favor? é que nao percebi a tua sugestão.



#6 Darky1203

Darky1203

    Novato

  • Membros
  • Pip
  • 8 mensagens
  • Localizaçãomarco de canaveses
  • huawei x3; tablet plaroid mid800 e ipgone 3gs

Mensagem publicada 02 July 2013 - 11:08

Já consegui diminuir a resposta mostrada ao utilizador. Só que agora surgiu outro problema. Isto foi o que eu alterei no CallSoap.

Transport.call(SOAP_ACTION, envelope);
response = (SoapObject) envelope.getResponse();
response= (SoapObject) response.getProperty(1);
table = (SoapObject) response.getProperty(0);
tableRow = (SoapObject) table.getProperty(0);
tableRow.getProperty("Resultado").toString();

e recebo resposta assim:

 

anyType{Resultado = 23;}

Como visualizar só o Resultado=23 neste caso já?

Obrigado a todos os que responderam e perderam o seu tempo em ajudar me ;)

 

abraço



#7 pedronveloso

pedronveloso

    Veloso

  • Administradores
  • 1578 mensagens
  • S8

Mensagem publicada 03 July 2013 - 03:34

Já consegui diminuir a resposta mostrada ao utilizador. Só que agora surgiu outro problema. Isto foi o que eu alterei no CallSoap.



Transport.call(SOAP_ACTION, envelope);
response = (SoapObject) envelope.getResponse();
response= (SoapObject) response.getProperty(1);
table = (SoapObject) response.getProperty(0);
tableRow = (SoapObject) table.getProperty(0);
tableRow.getProperty("Resultado").toString();

e recebo resposta assim:

Como visualizar só o Resultado=23 neste caso já?

Obrigado a todos os que responderam e perderam o seu tempo em ajudar me ;)

 

abraço

 

 

Assumindo que tens esse conteúdo na forma de String e uma vez que a string é relativamente simples podes fazer algo deste estilo:

String resposta = "anyType{Resultado = 23;}";
        int indexStart = resposta.indexOf("{");
        int indexEnd = resposta.indexOf(";");
        if (indexStart!=-1 && indexEnd!=-1){
            String subString = resposta.substring(indexStart,indexEnd);
        }

A comparação com "-1" é para saber se de facto foi encontrada uma ocorrência daquele caracter na String principal, se não for devolve -1 e se for encontrada devolve a posição na string principal.







Também marcado com uma ou mais destas tags: ksoap, web services, parsing