Autore Topic: Parsing HTML e stampare su textview  (Letto 522 volte)

Offline roxdragon

  • Nuovo arrivato
  • *
  • Post: 22
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Galaxy S3
  • Sistema operativo:
    Ubuntu 10.04
Parsing HTML e stampare su textview
« il: 01 Aprile 2014, 17:00:45 CEST »
0
Salve a tutti ho un problema...
Non sono molto pratico ma ho bisogno di stampare la temperatura su una textview!
La pagina web è cosi:

Codice: [Seleziona]
client.println(F("HTTP/1.1 200 OK"));
          client.println(F("Content-Type: text/html"));
          client.println(); 

          client.print(F("<html><head><title>ARDUINO Controllo via WEB</title><meta http-equiv='Content-Type' content='text/html; charset=iso-8859-1' ></head><body>"));
          client.println(F("<h1><center>Temperatura Attuale: "));
          client.println(temperature);
          client.println(F(" Gradi</h1></center>"));

          client.println(F("<h1>Portone Casa</h1>"));
          client.print(F("<h2><a href='/?C=30'>APRI</a>"));
          client.println(F("<hr />")); 

          client.println(F("<h1>Garage</h1>"));

          client.print(F("<h2><a href='/?L=2'>APRI</a>"));
          client.println(F("<hr />")); 
         
          client.println(F("<h1>Luce Scala</h1>"));

          client.print(F("<h2><a href='/?L=3'>ACCENDI</a>"));
         
          client.println(F("</body></html>"));

La pagina è su un arduino, e se provo a visualizzare il sorgente pagina da chrome mi da:
Codice: [Seleziona]
<html><head><title>ARDUINO Controllo via WEB</title><meta http-equiv='Content-Type' content='text/html; charset=iso-8859-1' ></head><body><h1>Portone Casa</h1>
18.56
<h2><a href='/?C=30'>APRI</a><hr />
<h1>Garage</h1>
<h2><a href='/?L=2'>APRI</a><hr />
<h1>Luce Scala</h1>
<h2><a href='/?L=3'>ACCENDI</a></body></html>

Mi interessa stampare solamente il numero dei gradi!
Questo è invece il mio temperature.java:

Codice: [Seleziona]
package com.gianni.homecontrol;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
public class temperature extends Fragment {
   @Override
      public View onCreateView(LayoutInflater inflater, ViewGroup container,
              Bundle savedInstanceState) {
          View ios = inflater.inflate(R.layout.temperature, container, false);
         
          ((TextView)ios.findViewById(R.id.textView2)).setText("iOS");
          return ios;
}}

Ripeto non sono molto pratico, conosco C e qualche nozione di html, ho visto che si parla di classi.... :-\
sapete darmi una dritta? ho letto il tutorial [medio] Ottenere dati da una pagina HTML - Android Developers Italia
ho scaricato la lib e l'ho messa all'interno del progetto, però non capisco, dove creare la classe...
Qualche esempio? Grazie

Post unito: 01 Aprile 2014, 18:00:39 CEST
Salve, scusate per il doppio post non ho editato il primo perchè altrimenti facevo confusione...
ho modificato il mio codice.. temperature.java:
Codice: [Seleziona]
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
public class temperature extends Fragment {
   @Override
      public View onCreateView(LayoutInflater inflater, ViewGroup container,
              Bundle savedInstanceState) {
                    View ios = inflater.inflate(R.layout.temperature, container, false);
         // ((TextView)ios.findViewById(R.id.textView2)).setText("iOS");

                    TextView tv = (TextView)findViewById(R.id.textView2);

                    try {
                 
                            HtmlParser hp = new HtmlParser("http://192.168.1.3");

                            /* passiamo il risultato alla TextView per visualizzarli. */
                            tv.setText(hp.Stampa("Attuale"));
                       
                    } catch (Exception e) {
               /* In caso di errore, passiamo l'errore alla TextView. */
                            tv.setText("Problema nel parsing: \n" + e.getMessage());
                            Log.e("Error", e.toString());
                    }
         
                    /* Carichiamo il contenuto della TextView all'interno della View dell'Activity. */
                    this.setContentView(tv);
                        return tv;
                   }
                   private void setContentView(TextView tv) {
                           // TODO Auto-generated method stub
                   }

                   private TextView findViewById(int textview2) {
                           // TODO Auto-generated method stub
                           return null;
                   }
        }
         
e il HtmlParse.java:
Codice: [Seleziona]
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

import org.htmlcleaner.CleanerProperties;
import org.htmlcleaner.HtmlCleaner;
import org.htmlcleaner.TagNode;

import android.util.Log;
public class HtmlParser {
       
        // oggetto TagNode radice del file html
                private TagNode rootNode;
                private String url_str = null;
               
                public HtmlParser(String url_str)
                {
                        //URL di cui si vuole fare il parsing
                        this.url_str = "http://192.168.1.3/;
                       
                        // inizializzazione dell'oggetto HtmlCleaner utile a generare un html pulito
                        HtmlCleaner cleaner = new HtmlCleaner();
                        CleanerProperties props = cleaner.getProperties();
                        props.setAllowHtmlInsideAttributes(true);
                        props.setAllowMultiWordAttributes(true);
                        props.setRecognizeUnicodeChars(true);
                        props.setOmitComments(true);
                         
                        // apertura della connessione
                        URL url;
                        try {
                               
                                url = new URL(url_str);
                                URLConnection conn = url.openConnection();
                               
                                //ora utilizziamo l'oggetto cleaner per "ripulire" l'html e inizializzare l'oggetto rootNode
                                rootNode = cleaner.clean(new InputStreamReader(conn.getInputStream()));
                               
                               
                        } catch (MalformedURLException e) {
                                // TODO Auto-generated catch block
                                Log.e("Error", e.getMessage());
                               
                        } catch (IOException e) {
                                // TODO Auto-generated catch block
                                Log.e("Error", e.getMessage());
                        }
                }
               
               
                List<Object> getElement(String elementName)
            {
                List<Object> elementList = new ArrayList<Object>();

                TagNode Elements[] = rootNode.getElementsByName(elementName, true);
                for (int i = 0; Elements != null && i < Elements.length; i++)
                {

                    String type = Elements[i].getAttributeByName("href");
                    if ( type != null )
                    {
                        elementList.add(Elements[i]);
                    }

                }

                return elementList;
            }
               
                public String Stampa(String elementName)
            {
                    StringBuffer sb = new StringBuffer();
                   
                try
                {
                   
                    List<Object> elementi = this.getElement(elementName);

                    sb.append(">>> Stampa contenuto degli elementi '"+elementName+"' per il sito '"+url_str+"'\n");
                    for (Iterator<Object> iterator = elementi.iterator(); iterator.hasNext();)
                    {
                        TagNode Element = (TagNode) iterator.next();
                       
                        sb.append("Link: " + Element.getAttributeByName("href").toString()+"\n");
                       
                       
                    }
                   
                    return sb.toString();
                }
                catch(Exception e)
                {
                    e.printStackTrace();
                }
               
                return null;
            }

               
        }
non ho fatto altre modifiche... c'è qualcosa che sbaglio o devo inserire?? se si dove?
Grazie
« Ultima modifica: 01 Aprile 2014, 18:00:49 CEST da roxdragon, Reason: Merged DoublePost »

Offline bradipao

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 4043
  • keep it simple
  • Respect: +567
    • Github
    • Google+
    • bradipao
    • Mostra profilo
  • Dispositivo Android:
    Nexus 5
  • Play Store ID:
    Bradipao
  • Sistema operativo:
    W7
Re:Parsing HTML e stampare su textview
« Risposta #1 il: 01 Aprile 2014, 18:47:08 CEST »
0
A me sembra che nell'HTML restituito dallì'arduino manchi il campo "temperature", benchè nel codice arduino sembra che ci sia. Sicuro sia proprio quello?
NON rispondo a domande nei messaggi privati
Bradipao @ Play Store

Offline roxdragon

  • Nuovo arrivato
  • *
  • Post: 22
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Galaxy S3
  • Sistema operativo:
    Ubuntu 10.04
Re:Parsing HTML e stampare su textview
« Risposta #2 il: 01 Aprile 2014, 19:04:20 CEST »
0
Si si sono sicuro. . Il campo temperatura  non c e perché e una variabile...
il codice l ho scritto su.. in sintesi stampa una variabile su html dritto dritto.. soluzioni?
In questo caso la temperatura è : 18.56!

Codice: [Seleziona]
<html><head><title>ARDUINO Controllo via WEB</title><meta http-equiv='Content-Type' content='text/html; charset=iso-8859-1' ></head><body><h1>Portone Casa</h1>
18.56

EDIT: questo è il nuovo codice su arduino:
Codice: [Seleziona]
client.println(F("HTTP/1.1 200 OK"));
          client.println(F("Content-Type: text/html"));
          client.println(); 

          client.print(F("<html><head><title>ARDUINO Controllo via WEB</title><meta http-equiv='Content-Type' content='text/html; charset=iso-8859-1' ></head><body>"));
          client.println(F("<h1><center>Temperatura Attuale: "));
          client.println(temperature);
          client.println(F(" Gradi</h1></center>"));
Al centro della pagina html stampa: Temperatura attuale: xy Gradi
devo prendere il numero...come faccio?
Sorgente pagina:
Codice: [Seleziona]
<html><head><title>ARDUINO Controllo via WEB<</title>meta http-equiv='Content-Type' content='text/html; charset=iso-8859-1' >head>body>h1>center>Temperatura Attuale:
20.00
 Gradih1>center>
h1>

Post unito: 02 Aprile 2014, 01:23:24 CEST
Up, ci sto sbattendo tantissimo per questo parsing, ho un app con dei tab, quindi nel tab temperatura ho un layout.. e su temperature.java ho:
Codice (Java): [Seleziona]
import java.net.URL;

import org.htmlcleaner.CleanerProperties;
import org.htmlcleaner.HtmlCleaner;
import org.htmlcleaner.TagNode;
 
import android.os.Bundle;
import android.widget.TextView;

import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
public class temperature extends Fragment {
   @Override
      public View onCreateView(LayoutInflater inflater, ViewGroup container,
              Bundle savedInstanceState) {
                  View ios = inflater.inflate(R.layout.temperature, container, false);
   /*       ((TextView)ios.findViewById(R.id.textView2)).setText("iOS");
                return ios;
   }
  }*/

           
 
       
              TextView mTxtvHTMLText = (TextView) findViewById(R.id.textView2);  
       
              String value = "";  
              try {  
                  value = getHomeTitle();  
                  mTxtvHTMLText.setText(value);  
                   
              } catch (Exception e) {  
                  // TODO Auto-generated catch block  
                  mTxtvHTMLText.setText("Error");  
              }
                        return mTxtvHTMLText;  
       
          }  
       
          private TextView findViewById(int textview2) {
        // TODO Auto-generated method stub
        return null;
}

                public String getHomeTitle() throws Exception {  
              // TODO Auto-generated method stub  
              String homeTitle = "";  
       
              HtmlCleaner htmlCleaner = new HtmlCleaner();  
              CleanerProperties props = htmlCleaner.getProperties();  
              props.setAllowHtmlInsideAttributes(false);  
              props.setAllowMultiWordAttributes(true);  
              props.setRecognizeUnicodeChars(true);  
              props.setOmitComments(true);  
       
              URL url = new URL("http://192.168.1.3/");  
              TagNode root = htmlCleaner.clean(url);  
       
              Object[] homeTitleNode = root.evaluateXPath("<html>:");  
              if (homeTitleNode.length > 0) {  
                  TagNode resultNode = (TagNode) homeTitleNode[0];  
                  homeTitle = resultNode.getText().toString();  
              }  
       
              return homeTitle;  
          }  
       
          }
L'app mi crasha..ecco il logcat:
Codice: [Seleziona]
04-01 19:22:22.229: E/AndroidRuntime(1701): FATAL EXCEPTION: main
04-01 19:22:22.229: E/AndroidRuntime(1701): Process: com.gianni.homecontrol, PID: 1701
04-01 19:22:22.229: E/AndroidRuntime(1701): java.lang.NullPointerException
04-01 19:22:22.229: E/AndroidRuntime(1701):         at com.gianni.homecontrol.temperature.onCreateView(temperature.java:37)
04-01 19:22:22.229: E/AndroidRuntime(1701):         at android.support.v4.app.Fragment.performCreateView(Fragment.java:1500)
04-01 19:22:22.229: E/AndroidRuntime(1701):         at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:927)
04-01 19:22:22.229: E/AndroidRuntime(1701):         at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1104)
04-01 19:22:22.229: E/AndroidRuntime(1701):         at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:682)
04-01 19:22:22.229: E/AndroidRuntime(1701):         at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1467)
04-01 19:22:22.229: E/AndroidRuntime(1701):         at android.support.v4.app.FragmentManagerImpl.executePendingTransactions(FragmentManager.java:472)
04-01 19:22:22.229: E/AndroidRuntime(1701):         at android.support.v4.app.FragmentStatePagerAdapter.finishUpdate(FragmentStatePagerAdapter.java:163)
04-01 19:22:22.229: E/AndroidRuntime(1701):         at android.support.v4.view.ViewPager.populate(ViewPager.java:1068)
04-01 19:22:22.229: E/AndroidRuntime(1701):         at android.support.v4.view.ViewPager.populate(ViewPager.java:914)
04-01 19:22:22.229: E/AndroidRuntime(1701):         at android.support.v4.view.ViewPager.onMeasure(ViewPager.java:1436)
04-01 19:22:22.229: E/AndroidRuntime(1701):         at android.view.View.measure(View.java:16458)
04-01 19:22:22.229: E/AndroidRuntime(1701):         at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5125)
04-01 19:22:22.229: E/AndroidRuntime(1701):         at android.widget.FrameLayout.onMeasure(FrameLayout.java:310)
04-01 19:22:22.229: E/AndroidRuntime(1701):         at android.view.View.measure(View.java:16458)
04-01 19:22:22.229: E/AndroidRuntime(1701):         at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5125)
04-01 19:22:22.229: E/AndroidRuntime(1701):         at com.android.internal.widget.ActionBarOverlayLayout.onMeasure(ActionBarOverlayLayout.java:327)
04-01 19:22:22.229: E/AndroidRuntime(1701):         at android.view.View.measure(View.java:16458)
04-01 19:22:22.229: E/AndroidRuntime(1701):         at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5125)
04-01 19:22:22.229: E/AndroidRuntime(1701):         at android.widget.FrameLayout.onMeasure(FrameLayout.java:310)
04-01 19:22:22.229: E/AndroidRuntime(1701):         at com.android.internal.policy.impl.PhoneWindow$DecorView.onMeasure(PhoneWindow.java:2289)
04-01 19:22:22.229: E/AndroidRuntime(1701):         at android.view.View.measure(View.java:16458)
04-01 19:22:22.229: E/AndroidRuntime(1701):         at android.view.ViewRootImpl.performMeasure(ViewRootImpl.java:1914)
04-01 19:22:22.229: E/AndroidRuntime(1701):         at android.view.ViewRootImpl.measureHierarchy(ViewRootImpl.java:1111)
04-01 19:22:22.229: E/AndroidRuntime(1701):         at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1293)
04-01 19:22:22.229: E/AndroidRuntime(1701):         at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:998)
04-01 19:22:22.229: E/AndroidRuntime(1701):         at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:5582)
04-01 19:22:22.229: E/AndroidRuntime(1701):         at android.view.Choreographer$CallbackRecord.run(Choreographer.java:749)
04-01 19:22:22.229: E/AndroidRuntime(1701):         at android.view.Choreographer.doCallbacks(Choreographer.java:562)
04-01 19:22:22.229: E/AndroidRuntime(1701):         at android.view.Choreographer.doFrame(Choreographer.java:532)
04-01 19:22:22.229: E/AndroidRuntime(1701):         at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:735)
04-01 19:22:22.229: E/AndroidRuntime(1701):         at android.os.Handler.handleCallback(Handler.java:733)
04-01 19:22:22.229: E/AndroidRuntime(1701):         at android.os.Handler.dispatchMessage(Handler.java:95)
04-01 19:22:22.229: E/AndroidRuntime(1701):         at android.os.Looper.loop(Looper.java:137)
04-01 19:22:22.229: E/AndroidRuntime(1701):         at android.app.ActivityThread.main(ActivityThread.java:4998)
04-01 19:22:22.229: E/AndroidRuntime(1701):         at java.lang.reflect.Method.invokeNative(Native Method)
04-01 19:22:22.229: E/AndroidRuntime(1701):         at java.lang.reflect.Method.invoke(Method.java:515)
04-01 19:22:22.229: E/AndroidRuntime(1701):         at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:777)
04-01 19:22:22.229: E/AndroidRuntime(1701):         at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:593)
04-01 19:22:22.229: E/AndroidRuntime(1701):         at dalvik.system.NativeStart.main(Native Method)

Aiutoo :(
« Ultima modifica: 02 Aprile 2014, 01:23:29 CEST da roxdragon, Reason: Merged DoublePost »