Autore Topic: Come trasformare una stringa html in java  (Letto 803 volte)

Offline DamianFox

  • Nuovo arrivato
  • *
  • Post: 17
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy S2
  • Sistema operativo:
    Windows 7
Come trasformare una stringa html in java
« il: 18 Giugno 2013, 16:22:22 CEST »
0
Salve a tutti!
Sto facendo un'applicazione nella quale ho un'attività dove attraverso un url simile a questo:
http://maps.googleapis.com/maps/api/directions/xml?origin=Chicago,IL&destination=Los+Angeles,CA&waypoints=Joplin,MO|Oklahoma+City,OK&sensor=false
mi ritorna un file xml come questo:
Codice (XML): [Seleziona]
<DirectionsResponse>
 <status>OK</status>
 <route>
  <summary>I-40 W</summary>
  <leg>
   <step>
    <travel_mode>DRIVING</travel_mode>
    <start_location>
     <lat>41.8507300</lat>
     <lng>-87.6512600</lng>
    </start_location>
    <end_location>
     <lat>41.8525800</lat>
     <lng>-87.6514100</lng>
    </end_location>
    <polyline>
     <points>a~l~Fjk~uOwHJy@P</points>
    </polyline>
    <duration>
     <value>19</value>
     <text>1 min</text>
    </duration>
    <html_instructions>Head <b>north</b> on <b>S Morgan St</b> toward <b>W Cermak Rd</b></html_instructions>
    <distance>
     <value>207</value>
     <text>0.1 mi</text>
    </distance>
   </step>
   ...
   ... additional steps of this leg
  ...
  ... additional legs of this route
   <duration>
    <value>74384</value>
    <text>20 hours 40 mins</text>
   </duration>
   <distance>
    <value>2137146</value>
    <text>1,328 mi</text>
   </distance>
   <start_location>
    <lat>35.4675602</lat>
    <lng>-97.5164276</lng>
   </start_location>
   <end_location>
    <lat>34.0522342</lat>
    <lng>-118.2436849</lng>
   </end_location>
   <start_address>Oklahoma City, OK, USA</start_address>
   <end_address>Los Angeles, CA, USA</end_address>
  <copyrights>Map data ©2010 Google, Sanborn</copyrights>
  <overview_polyline>
   <points>a~l~Fjk~uOnzh@vlbBtc~@tsE`vnApw{A`dw@~w\|tNtqf@l{Yd_Fblh@rxo@b}@xxSfytAblk@xxaBeJxlcBb~t@zbh@jc|Bx}C`rv@rw|@rlhA~dVzeo@vrSnc}Axf]fjz@xfFbw~@dz{A~d{A|zOxbrBbdUvpo@`cFp~xBc`Hk@nurDznmFfwMbwz@bbl@lq~@loPpxq@bw_@v|{CbtY~jGqeMb{iF|n\~mbDzeVh_Wr|Efc\x`Ij{kE}mAb~uF{cNd}xBjp]fulBiwJpgg@|kHntyArpb@bijCk_Kv~eGyqTj_|@`uV`k|DcsNdwxAott@r}q@_gc@nu`CnvHx`k@dse@j|p@zpiAp|gEicy@`omFvaErfo@igQxnlApqGze~AsyRzrjAb__@ftyB}pIlo_BflmA~yQftNboWzoAlzp@mz`@|}_@fda@jakEitAn{fB_a]lexClshBtmqAdmY_hLxiZd~XtaBndgC</points>
  </overview_polyline>
  <optimized_waypoint_index>0</optimized_waypoint_index>
  <optimized_waypoint_index>1</optimized_waypoint_index>
  <bounds>
   <southwest>
    <lat>34.0523600</lat>
    <lng>-118.2435600</lng>
   </southwest>
   <northeast>
    <lat>41.8781100</lat>
    <lng>-87.6297900</lng>
   </northeast>
  </bounds>
 </route>
</DirectionsResponse>

Con questo XML mi costruisco una ListView dove per ogni oggetto della lista è presente il valore del tag
Codice (XML): [Seleziona]
<html_instructions>Però per ogni valore che mi ritorna sono presenti anche tag html come <b> oppure <div>.
Quindi ho scaricato la libreria StringEscapeUtils per convertire l'html in stringa Java, usando il metodo
Codice (Java): [Seleziona]
String escapedKeyHtmlInstructions = StringEscapeUtils.escapeHtml4(KEY_HTML_INSTRUCTIONS);Ma non funziona.
Ho provato ad usare anche la libreria JSoup per fare il parsing e anche ad usare il medoto replaceAll in questo modo:
Codice (Java): [Seleziona]
KEY_HTML_INSTRUCTIONS.replaceAll("\\<.*?>", "");Ma nemmeno questi due metodi hanno funzionato.

Ecco l'attività che genera la lista:

Codice (Java): [Seleziona]
import java.util.ArrayList;
import java.util.HashMap;

import maps.XMLParser;

import org.apache.commons.lang3.StringEscapeUtils;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;

import android.app.ListActivity;
import android.app.ProgressDialog;
import android.content.Intent;
import android.os.AsyncTask;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ListAdapter;
import android.widget.ListView;
import android.widget.SimpleAdapter;
import android.widget.TextView;


public class DirectionsActivity extends ListActivity {
       
        String url = "";
    XMLParser parser;
    String xml = "";
    ArrayList<HashMap<String, String>> menuItems;
   
    // All static variables
    static final String KEY_STEP = "step"; // parent node
    static final String KEY_HTML_INSTRUCTIONS = "html_instructions";
    static final String KEY_DURATION = "duration";
    static final String KEY_DISTANCE = "distance";
    static final String KEY_TEXT = "text";
   
   

        @Override
        protected void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                setContentView(R.layout.main);
               
                Intent intent = this.getIntent();
               
                url = intent.getExtras().getString("url");
                System.out.println("---------------" + url);
               
                menuItems = new ArrayList<HashMap<String, String>>();
                 
        parser = new XMLParser();
       
        DownloadTask downloadTask = new DownloadTask();
       
        // Start downloading XML data from Google Directions API
        downloadTask.execute(url);
       
        // selecting single ListView item
        ListView lv = getListView();        
     
        // listening to single listitem click
        lv.setOnItemClickListener(new OnItemClickListener() {

           @Override
           public void onItemClick(AdapterView<?> parent, View view,
                   int position, long id) {
               // getting values from selected ListItem
               String instruction = ((TextView) view.findViewById(R.id.instruction)).getText().toString();
               
               // Starting new intent
               Intent in = new Intent(getApplicationContext(), SingleMenuItemActivity.class);
               in.putExtra(KEY_HTML_INSTRUCTIONS, instruction);

               startActivity(in);

           }
       });
        }
       
        /** A class to download data from Google Directions URL */
    private class DownloadTask extends AsyncTask<String, Void, String>{
       
        ListAdapter adapter;
        private ProgressDialog pd;
       
        @Override
        protected void onPreExecute() {
                 pd = new ProgressDialog(DirectionsActivity.this);
                 pd.setTitle("Processing...");
                 pd.setMessage("Calcolo direzione in corso dalla posizione corrente...");
                 pd.setCancelable(false);
                 pd.setIndeterminate(true);
                 pd.show();
        }
       
        // Downloading data in non-ui thread
        @Override
        protected String doInBackground(String... url) {
 
            // For storing data from web service
            String data = "";
 
            try{
                // Fetching the data from web service
                data = parser.getXmlFromUrl(url[0]);
            }catch(Exception e){
                Log.d("Background Task",e.toString());
            }
            return data;
        }
 
        // Executes in UI thread, after the execution of
        // doInBackground()
        @Override
        protected void onPostExecute(String result) {
            super.onPostExecute(result);
           
            Document doc = parser.getDomElement(result); // getting DOM element
           
            NodeList nl = doc.getElementsByTagName(KEY_STEP);
            // looping through all item nodes <step>
            for (int i = 0; i < nl.getLength(); i++) {
                // creating new HashMap
                HashMap<String, String> map = new HashMap<String, String>();
                Element e = (Element) nl.item(i);
                // adding each child node to HashMap key => value
                String escapedKeyHtmlInstructions = StringEscapeUtils.escapeHtml4(KEY_HTML_INSTRUCTIONS);
                // KEY_HTML_INSTRUCTIONS.replaceAll("\\<.*?>", "");
                map.put(KEY_HTML_INSTRUCTIONS, parser.getValue(e, escapedKeyHtmlInstructions));
                map.put(KEY_DURATION, parser.getValue(e, KEY_TEXT));
                map.put(KEY_DISTANCE, parser.getSecondValue(e, KEY_TEXT));
                     
                // adding HashList to ArrayList
                menuItems.add(map);
            }
           
            // Adding menuItems to ListView
            adapter = new SimpleAdapter(DirectionsActivity.this, menuItems,R.layout.list_item,
                    new String[] { KEY_HTML_INSTRUCTIONS, KEY_DURATION, KEY_DISTANCE}, new int[] {
                            R.id.instruction, R.id.duration, R.id.distance});
     
            setListAdapter(adapter);
           
            pd.dismiss();
        }
    }
   
}


Qualcuno ha qualche consiglio da darmi?
Grazie!

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:Come trasformare una stringa html in java
« Risposta #1 il: 18 Giugno 2013, 16:58:22 CEST »
+1
intanto, io ti consiglio di usare la versione json delle directionsAPI, ti eviti il parserXML e sfrutti il json nativo (io ho una libreria in locale per le directions API)

come seconda cosa, non hai bisogno di parsing o cose strane, fai in modo che le textview renderizzino l'html
android - How to display HTML in TextView? - Stack Overflow
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 DamianFox

  • Nuovo arrivato
  • *
  • Post: 17
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy S2
  • Sistema operativo:
    Windows 7
Re:Come trasformare una stringa html in java
« Risposta #2 il: 18 Giugno 2013, 17:49:57 CEST »
0
Intanto grazie per la risposta.

Ho modificato il codice così:
Codice (Java): [Seleziona]
String instructionValue = parser.getValue(e, KEY_HTML_INSTRUCTIONS);
String instructionValueFixed = Html.fromHtml(instructionValue).toString();
map.put(KEY_HTML_INSTRUCTIONS, instructionValueFixed);

Ed ora funziona!
Grazie mille!
« Ultima modifica: 18 Giugno 2013, 17:56:25 CEST da DamianFox »