Autore Topic: Problema parsing XML  (Letto 611 volte)

Offline Valeboccaccio

  • Utente junior
  • **
  • Post: 75
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    SGSII
  • Sistema operativo:
    Windows 7
Problema parsing XML
« il: 26 Dicembre 2012, 15:42:15 CET »
0
Salve ragazzi ho un problema con un ciclo for, vi spiego devo effettuare il parsing di una pagina XML e tramite un ciclo for prendere tutti i dati contenuti nella pagina e importarli in un db, il mio problema è col ciclo che invece di prendere tutti i tag della pagina ne prende uno soltanto.
Vi mostro il codice utilizzato:
Codice (Java): [Seleziona]
 
// parsing XML
            if (result!=null) try {
               
               // aggiorno la progress dialog
               publishProgress("Parsing XML response...");
               
               // creo il document builder
               DocumentBuilderFactory dbf;
               dbf = DocumentBuilderFactory.newInstance();
               DocumentBuilder db = dbf.newDocumentBuilder();

               // parsing dell'xml
               Document doc = db.parse(new InputSource(new StringReader(result)));
               
               // esplorazione xml
               NodeList nl = doc.getElementsByTagName("coupons");
               
              Log.e("XXX","Numero ricercato: "+nl.getLength());
               
               for (ncoupon=0; ncoupon<nl.getLength() ; ncoupon++) {
                 
               
               if (nl!=null && nl.getLength()>0) {
                  domain = doc.getElementsByTagName("domain").item(ncoupon).getFirstChild().getNodeValue();
                  program = doc.getElementsByTagName("program").item(ncoupon).getFirstChild().getNodeValue();
                  description = doc.getElementsByTagName("description").item(ncoupon).getFirstChild().getNodeValue();
                  link =doc.getElementsByTagName("link").item(ncoupon).getFirstChild().getNodeValue();
              //Log.e("XXX", "Domain : "+domain+", Program : "+program+", Description : "+description);
               } else {
                  domain = "";
                  program = "";
                  description = "";
                  link = "";
              }
               }

Il logcat mi mostra infatti che il numero ricercato è pari a uno, dovrebbero invece essere un centinaio.
Vi ringrazio  O:-)
« Ultima modifica: 26 Dicembre 2012, 21:08:33 CET da Ricky`, Reason: titolo e sezione errati »
Domani Smetto.

Offline Nicola_D

  • Moderatore
  • Utente storico
  • *****
  • Post: 2479
  • SBAGLIATO!
  • Respect: +323
    • Github
    • Google+
    • nicoladorigatti
    • Mostra profilo
  • Dispositivo Android:
    Nexus 6p, Nexus 4, Nexus S, Nexus 7(2012)
  • Sistema operativo:
    Windows 7
Re:Problema parsing XML
« Risposta #1 il: 26 Dicembre 2012, 21:28:16 CET »
+1
senza vedere l'xml la vedo dura..
IMPORTANTE:NON RISPONDO A PROBLEMI VIA MESSAGGIO PRIVATO
LOGCAT: Non sai cos'è? -> Android Debug Bridge | Android Developers
               Dov'è in Eclipse? -> Window -> Open Prospective -> DDMS e guarda in basso!
[Obbligatorio] Logcat, questo sconosciuto! (Gruppo AndDev.it LOGTFO) - Android Developers Italia

Offline Valeboccaccio

  • Utente junior
  • **
  • Post: 75
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    SGSII
  • Sistema operativo:
    Windows 7
Re:Problema parsing XML
« Risposta #2 il: 27 Dicembre 2012, 09:18:43 CET »
0
Hai ragione scusami:
http://www.coupapps.com/coupons_detailed.xml
mente il logcat mostrato è il seguente
Codice: [Seleziona]
12-27 08:35:47.415: D/dalvikvm(337): GC_EXTERNAL_ALLOC freed 815 objects / 57432 bytes in 48ms
12-27 08:35:48.125: I/ActivityManager(59): Displayed activity it.coupapps1/.CoupApps1: 3481 ms (total 3481 ms)
12-27 08:35:54.165: D/dalvikvm(119): GC_EXPLICIT freed 1199 objects / 68864 bytes in 112ms
12-27 08:35:59.205: D/dalvikvm(244): GC_EXPLICIT freed 163 objects / 11840 bytes in 135ms
12-27 08:36:05.225: D/dalvikvm(262): GC_EXPLICIT freed 240 objects / 11528 bytes in 104ms
12-27 08:37:25.001: D/SntpClient(59): request time failed: java.net.SocketException: Address family not supported by protocol
12-27 08:37:37.485: E/XXX(337): http://www.coupapps.com/coupons_detailed.xml?
12-27 08:37:41.275: D/dalvikvm(337): GC_FOR_MALLOC freed 1879 objects / 90160 bytes in 48ms
12-27 08:37:41.275: I/dalvikvm-heap(337): Grow heap (frag case) to 4.222MB for 485538-byte allocation
12-27 08:37:41.325: D/dalvikvm(337): GC_FOR_MALLOC freed 66 objects / 2744 bytes in 44ms
12-27 08:37:44.185: D/dalvikvm(337): GC_FOR_MALLOC freed 295 objects / 15808 bytes in 42ms
12-27 08:37:44.195: I/dalvikvm-heap(337): Grow heap (frag case) to 4.684MB for 485538-byte allocation
12-27 08:37:44.245: D/dalvikvm(337): GC_FOR_MALLOC freed 69 objects / 499104 bytes in 47ms
12-27 08:37:52.785: D/dalvikvm(337): GC_FOR_MALLOC freed 4704 objects / 375456 bytes in 50ms
12-27 08:38:03.855: D/dalvikvm(337): GC_FOR_MALLOC freed 5636 objects / 240144 bytes in 58ms
12-27 08:38:16.334: D/dalvikvm(337): GC_FOR_MALLOC freed 6594 objects / 274272 bytes in 66ms
12-27 08:38:32.905: D/dalvikvm(337): GC_FOR_MALLOC freed 8373 objects / 352144 bytes in 78ms
12-27 08:38:45.205: E/XXX(337): Numero ricercato: 1
12-27 08:38:56.215: D/dalvikvm(337): GC_FOR_MALLOC freed 24381 objects / 869576 bytes in 94ms
12-27 08:38:59.105: W/InputManagerService(59): Window already focused, ignoring focus gain of: com.android.internal.view.IInputMethodClient$Stub$Proxy@44eb2270


« Ultima modifica: 27 Dicembre 2012, 09:40:22 CET da Valeboccaccio »
Domani Smetto.

Offline Nicola_D

  • Moderatore
  • Utente storico
  • *****
  • Post: 2479
  • SBAGLIATO!
  • Respect: +323
    • Github
    • Google+
    • nicoladorigatti
    • Mostra profilo
  • Dispositivo Android:
    Nexus 6p, Nexus 4, Nexus S, Nexus 7(2012)
  • Sistema operativo:
    Windows 7
Re:Problema parsing XML
« Risposta #3 il: 27 Dicembre 2012, 09:37:26 CET »
+1
in questa riga:
Codice (Java): [Seleziona]
// esplorazione xml
               NodeList nl = doc.getElementsByTagName("coupons");
metti "coupon" invece che coupons
IMPORTANTE:NON RISPONDO A PROBLEMI VIA MESSAGGIO PRIVATO
LOGCAT: Non sai cos'è? -> Android Debug Bridge | Android Developers
               Dov'è in Eclipse? -> Window -> Open Prospective -> DDMS e guarda in basso!
[Obbligatorio] Logcat, questo sconosciuto! (Gruppo AndDev.it LOGTFO) - Android Developers Italia

Offline Valeboccaccio

  • Utente junior
  • **
  • Post: 75
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    SGSII
  • Sistema operativo:
    Windows 7
Re:Problema parsing XML
« Risposta #4 il: 27 Dicembre 2012, 09:47:56 CET »
0
in questa riga:
Codice (Java): [Seleziona]
// esplorazione xml
               NodeList nl = doc.getElementsByTagName("coupons");
metti "coupon" invece che coupons
Ti ringrazio Nicola_D  :-)
Domani Smetto.

Offline Valeboccaccio

  • Utente junior
  • **
  • Post: 75
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    SGSII
  • Sistema operativo:
    Windows 7
Re:Problema parsing XML
« Risposta #5 il: 27 Dicembre 2012, 10:13:50 CET »
0
E secondo il tuo parere inserendo in fondo al parsing tale codice
Codice (Java): [Seleziona]
  ContentValues values = new ContentValues(567);
                values.put(PRODUCT_DOMAIN,  domain);
                values.put(PRODUCT_PROGRAM, program );
                values.put(PRODUCT_DESCRIPTION, description );      
                values.put(PRODUCT_START_DATE, start_date );
                values.put(PRODUCT_END_DATE, end_date );
                values.put(PRODUCT_LINK, link);
                values.put(PRODUCT_CODE, code);
                if(database!=null){
                database.insert(PRODUCTS_TABLE, null, values);
                } else{
                    Log.e("MyAppError", "Database is null");
                }
mi è possibile inserire tali dati parsati dentro un db precedentemente creato?
Ti ringrazio ancora  :-)
Domani Smetto.

Offline Nicola_D

  • Moderatore
  • Utente storico
  • *****
  • Post: 2479
  • SBAGLIATO!
  • Respect: +323
    • Github
    • Google+
    • nicoladorigatti
    • Mostra profilo
  • Dispositivo Android:
    Nexus 6p, Nexus 4, Nexus S, Nexus 7(2012)
  • Sistema operativo:
    Windows 7
Re:Problema parsing XML
« Risposta #6 il: 27 Dicembre 2012, 11:57:09 CET »
+1
In teoria si,anche se non mi convince troppo quel codice diparsing,ho l'impressione che sia soggetto ad arrayindexoutofbound exception.... io prenderei il nodo coupons,ciclerei sui figli e per ogni figlio prenderei i valori. Fatto come hai fatto te,credo che se hai un coupon senza figli ti salta tutto...
IMPORTANTE:NON RISPONDO A PROBLEMI VIA MESSAGGIO PRIVATO
LOGCAT: Non sai cos'è? -> Android Debug Bridge | Android Developers
               Dov'è in Eclipse? -> Window -> Open Prospective -> DDMS e guarda in basso!
[Obbligatorio] Logcat, questo sconosciuto! (Gruppo AndDev.it LOGTFO) - Android Developers Italia

Offline Valeboccaccio

  • Utente junior
  • **
  • Post: 75
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    SGSII
  • Sistema operativo:
    Windows 7
Re:Problema parsing XML
« Risposta #7 il: 27 Dicembre 2012, 16:48:31 CET »
0
In teoria si,anche se non mi convince troppo quel codice diparsing,ho l'impressione che sia soggetto ad arrayindexoutofbound exception.... io prenderei il nodo coupons,ciclerei sui figli e per ogni figlio prenderei i valori. Fatto come hai fatto te,credo che se hai un coupon senza figli ti salta tutto...


Immagino che non sia ottimo come codice ma è la mia prima app e sono decisamente un nubbio in programmazione android  :-)
Comunque al momento grazie a questo codice:
Codice (Java): [Seleziona]
 public class CoupApps1 extends Activity {

        private Context CT = null;
        // variabili utilizzate
           int ncoupon=0;
           String result=null;
           HttpClient client=null;
           String domain="",program="", description="",link="";
           
        // views visualizzate
           private ProgressDialog pd; //è il processo
           private Button btnGet,btnLink; //il tasto di ricerca
           private EditText editCoupon; //il textview di ricerca
           private TextView txtDomain,txtProgram,TxtDescription, txtCoupon;
           
           
           /** Called when the activity is first created. */
           @Override
           public void onCreate(Bundle savedInstanceState) {
              super.onCreate(savedInstanceState);
              setContentView(R.layout.activity_coup_apps1);
              CT = this;
             
           // imposto le views
              btnGet = (Button)findViewById(R.id.btnGet);
              editCoupon = (EditText)findViewById(R.id.editCoupon);
              txtDomain = (TextView)findViewById(R.id.txtDomain);
              txtProgram = (TextView)findViewById(R.id.txtProgram);
              btnLink = (Button)findViewById(R.id.btnLink);
              txtCoupon = (TextView)findViewById(R.id.txtCoupon);
              TxtDescription = (TextView)findViewById(R.id.txtDescription);
             
           // listener del button GET
              OnClickListener mGetListener = new OnClickListener() {
                 public void onClick(View v) {
                         
                // creo una progress dialog
                            pd = ProgressDialog.show(CoupApps1.this,"Ricerca","Connecting...",true,false);
                       
                           // creo e avvio asynctask
                                            HttpGetTask task = new HttpGetTask();
                                            task.execute(editCoupon.getText().toString());
                                         }
                                      };
                                      btnGet.setOnClickListener(mGetListener);
                                     
                                   // listener del button LINK
                                      OnClickListener mLinkListener = new OnClickListener() {
                                         public void onClick(View v) {
                                            // creo l'intent
                                            Intent viewIntent = new Intent("android.intent.action.VIEW", Uri.parse(link));
                                            // avvio l'activity
                                            startActivity(viewIntent);
                                         }
                                      };
                                      btnLink.setOnClickListener(mLinkListener);
                                     
                                   }
           
        // my AsyncTask
           private class HttpGetTask extends AsyncTask<String,String,String>  {

             

                //nome della tabella
               
                 private static final String TABLE_NAME = "coupon";
                 private String select;

                @Override
              protected String doInBackground(String... params) {

                 result = null;
                 
                 // interrogazione del web service
                 try {
                   
                    // aggiorno la progress dialog
                    publishProgress("Creating HTTP client and query...");
                 
                   
                 // creo la richiesta URI di tipo GET  
                    URI uri;
                    uri = new URI("http",null,"www.coupapps.com",-1,"/coupons_detailed.xml","",null);
                   
                    //Log.e("XXX", uri.toString());
                   
                    HttpUriRequest get = new HttpGet(uri);  
                   
                   
                        // istanzio il client HTTP
                    client = new DefaultHttpClient();
                   
                    // istanzio il gestore automatico di risposte HTTP
                    ResponseHandler<String> responseHandler = new BasicResponseHandler();

                    // eseguo la richiesta
                    result = client.execute(get,responseHandler);
                   
                  //Log.e("AAA", result.toString());
                   
               
                 } catch (HttpResponseException e) {
                    // gestisce le risposte diverse da HTTP
                    Log.w("COUPAPPS1","HTTP Response Exception : "+e.toString());
                 } catch (Exception e) {
                    Log.w("COUPAPPS1","Error : "+e.toString());
                 } finally {
                    if (client != null) client.getConnectionManager().shutdown();
                 }

              // parsing XML
                 if (result!=null) try {
                   
                    // aggiorno la progress dialog
                    publishProgress("Download dei Coupons in corso");
                   
                    // creo il document builder
                    DocumentBuilderFactory dbf;
                    dbf = DocumentBuilderFactory.newInstance();
                    DocumentBuilder db = dbf.newDocumentBuilder();

                    // parsing dell'xml
                    Document doc = db.parse(new InputSource(new StringReader(result)));
                   
                    // esplorazione xml
                    NodeList nl = doc.getElementsByTagName("coupon");
                   
                //Log.e("XXX","Numero ricercato: "+nl.getLength());
                   
                    for (ncoupon=0; ncoupon<nl.getLength() ; ncoupon++) {
                       
                   
                    if (nl!=null && nl.getLength()>0) {
                       domain = doc.getElementsByTagName("domain").item(ncoupon).getFirstChild().getNodeValue();
                       program = doc.getElementsByTagName("program").item(ncoupon).getFirstChild().getNodeValue();
                       description = doc.getElementsByTagName("description").item(ncoupon).getFirstChild().getNodeValue();
                       link =doc.getElementsByTagName("link").item(ncoupon).getFirstChild().getNodeValue();
                 //Log.e("XXX", "Domain : "+domain+", Program : "+program+", Description : "+description);
                    } else {
                       domain = "";
                       program = "";
                       description = "";
                       link = "";
                   }
                   
                    SQLiteDatabase database = (new DatabaseHelper(CT).getWritableDatabase());
                            ContentValues values = new ContentValues();
                        values.put("domain",  domain);
                        values.put("program", program );
                        values.put("description", description );      
                        //values.put(START_DATE, start_date );
                        //values.put(END_DATE, end_date );
                        values.put("link", link);
                        //values.put(CODE, code);
                       
                        if(database!=null){
                                database.insert(TABLE_NAME, null, values);
                                database.close();
                        } else{
                            Log.e("MyAppError", "Database is null");
                        }

                   
                    }

credo sia possibile fare il parsing e inserire i dati nel db.

Adesso sto cercando informazioni su come scrivere l'istruzione che prende la stringa digitata nel Button btnGet della schermata principale dell'activity e tramite una selezione sul db mostri i risultati ottenuti.

Codice (Java): [Seleziona]
  SQLiteDatabase database = ( new DatabaseHelper(CT).getReadableDatabase());
                    //select = "Select domain, program, description, link from coupon Where(domain like " + "'%"+params[0]+"%'" +")";          
                    Cursor cursor = database.query(TABLE_NAME, new String[] {"domain", "program", "description", "link"},
                            "domain like " + "'%"+params[0]+"%'", null, null, null, null);
                    cursor.moveToNext();

                    txtCoupon.setText(cursor.getString(cursor.getColumnIndex("params")));
                    startManagingCursor(cursor);
       

           
Log.e("AAA", params.toString());
                   

Ho impostato questa ma non mi arriva alcun dato al log.e.
Grazie in anticipo  :-)
« Ultima modifica: 27 Dicembre 2012, 18:13:27 CET da Valeboccaccio »
Domani Smetto.