Autore Topic: parsing da file xml con istanza Onclick  (Letto 495 volte)

Offline mikelino87

  • Nuovo arrivato
  • *
  • Post: 5
  • Respect: 0
    • Mostra profilo
parsing da file xml con istanza Onclick
« il: 03 Dicembre 2012, 10:29:01 CET »
0
Salve a tutti, sono un novello nel mondo android e della relativa programmazione... sto sviluppando un'app per un progetto universitario e avrei bisogno di un consiglio / aiuto per quanto riguarda il codice...
la mia idea è di scaricare un file xml dalla rete e di gestire il suo contenuto...
mi piacerebbe stampare il contenuto cliccando sul bottone e quindi stampare il contenuto a video...ma credo che ho un bel casotto in testa... vi posto il codice, spero in un vostro aiuto... grazie mille!!

Codice (Java): [Seleziona]
package com.ing;

import android.app.Activity;
import android.os.AsyncTask;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;


public class ListaPazienti extends Activity {
   
        TextView loadingTv;
       
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_lista_pazienti);
       
       
        loadingTv = (TextView) findViewById(R.id.loadingTv);
                Button start = (Button) findViewById(R.id.btnImport);
               
               
               
                start.setOnClickListener(new OnClickListener() {
                         
                        @Override
                        public void onClick(View arg0) {
                                LoadingStuffTask task = new LoadingStuffTask();
                                task.execute("Processo in esecuzione ...");
                               
                               
                //la stringa verra passata al metodo doInBackground del nostro AsyncTask
                //per controllare lo stato del task, possiamo chiamare task.getStatus()

                        }
                });

        }

        private class LoadingStuffTask extends AsyncTask<String, String, String> {
        // I tre tipi da dichiarare sono relativamente (in questo caso usiamo solo stringhe)
        // il parametro in entrata di doInBackground  (quando chiamiamo execute passiamo una stringa)
        // il paramentro in entrata di onProgressUpdate (dati che vogliamo mostrare all' utente -opzionale,potremmo usare variabili globali-)
        // il parametro in entrata di onPostExecure (una volta finito il task, potremmo voler mostrare un risultato all'utente)
        // nel caso non volessimo usare parametri di alcun genere tipizziamo con Void,Void,Void (passeremo poi dei null come parametri)

                @Override
                protected String doInBackground(String... params) {
                        publishProgress("\n" + params[0]);
                        // stringa passata a onProgressUpdate

                        String xmlUrl="https://dl.dropbox.com/s/4jtuxlaz67on161/messages.xml?dl=1";
                MyParser parser=new MyParser(); //otteniamo un istanza del nostro parser
                parser.parseXml(xmlUrl);//usiamo il parser

                ((TextView)findViewById(R.id.loadingTv)).setText(parser.getParsedData().toString());
                        return "Finish !";
                        // stringa passata a onPostExecute
                }

                @Override
                protected void onProgressUpdate(String... values) {
                        loadingTv.append(values[0] + "\n");
                }

                @Override
                protected void onPostExecute(String result) {
                        loadingTv.append(result + "\n");
                }

        }
        }

il relativo file xml
 
Codice (XML): [Seleziona]
<?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
   xmlns:tools="http://schemas.android.com/tools"
   android:id="@+id/LinearLayout3"
   android:layout_width="fill_parent"
   android:layout_height="fill_parent"
   android:background="#000000"
   android:gravity="center_horizontal"
   android:orientation="vertical"
   android:padding="5dp"
   android:visibility="visible"
   tools:ignore="HardcodedText" >
     
   
    <Button
       android:id="@+id/btnImport"
       android:layout_width="match_parent"
       android:layout_height="wrap_content"
       android:layout_marginLeft="10sp"
       android:layout_marginRight="10sp"
       android:layout_marginTop="50sp"
       android:text="Importa Elenco Pazienti" />
 
   <TextView  
   android:layout_width="fill_parent"
   android:layout_height="wrap_content"
   android:text="press start to begin"
   android:id="@+id/loadingTv"
   android:inputType="textMultiLine"
   />
 
 
</LinearLayout>

e gli altri codici java che fanno il controllo del contenuto del file per la stampa (Myparser.java)
Codice (Java): [Seleziona]
package com.ing;

import java.io.IOException;
import java.net.URL;
import java.util.ArrayList;

import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.FactoryConfigurationError;
import javax.xml.parsers.ParserConfigurationException;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;

import android.util.Log;

public class MyParser {
        static void vDebug(String debugString){         //metodi di convenienza
                Log.v("DomParsing", debugString+"\n");
        }
        static void eDebug(String debugString){
                Log.e("DomParsing", debugString+"\n");
        }
       
        ArrayList<MyNote> parsedData=new ArrayList<MyNote>();
        public ArrayList<MyNote> getParsedData() {
                return parsedData;
        }

    public void parseXml(String xmlUrl){
               
                Document doc;
                try {
                                               
                        doc=DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(new URL(xmlUrl).openStream());
                        //Costruiamo il nostro documento a partire dallo stream dati fornito dall'URL
                        Element root=doc.getDocumentElement();
                        //Elemento(nodo) radice del documento
                       
                        vDebug("Root element :" + root.getNodeName());
                        vDebug("");
                       
                        //NodeList notes=root.getElementsByTagName("note"); //potremmo direttamente prendere gli elementi note
                        NodeList notes=root.getChildNodes();
                        //ma prediamo tutti i "figli" diretti di root utile se non avessimo solo "note" come figli di root
                       
                        for(int i=0;i<notes.getLength();i++){//per ogni
                                Node c= notes.item(i);//nodo
                               
                               
                               
                                if(c.getNodeType()==Node.ELEMENT_NODE){//controlliamo se questo è un nodo elemento (un tag)
                                        //se avessimo usato root.getElementsByTagName("note") questo controllo
                                        //non sarebbe stato necessario
                                       
                                        MyNote newNote=new MyNote(); //costruiamo un oggetto MyNote dove andremo a salvare i dati
                                       
                                        Element note=(Element)c; //cast da nodo a Elemento
                                       
                                        //non controlliamo if(note.getNodeName().equals("note"))  in quanto sappiamo di avere solo "note" come childs
                                       
                                        String id=note.getAttribute("id"); // lettura attributo
                                        vDebug("_Attributo note id:"+id);
                                        vDebug("");
                                       
                                        newNote.setId(id); // settiamo l'id del nostro oggetto MyNote
                                       
                                        NodeList noteDetails=c.getChildNodes();  //per ogni nota abbiamo i vari dettagli
                                        for(int j=0;j<noteDetails.getLength();j++){
                                                Node c1=noteDetails.item(j);
                                               
                                                        if(c1.getNodeType()==Node.ELEMENT_NODE){ //anche in questo caso controlliamo se si tratta di tag
                                                                Element detail=(Element)c1; //cast
                                                                String nodeName=detail.getNodeName(); //leggo il nome del tag
                                                                String nodeValue=detail.getFirstChild().getNodeValue();//leggo il testo in esso contenuto
                                                                vDebug("______Dettaglio:"+nodeName);
                                                                vDebug("______Contenuto Dettaglio:"+nodeValue);
                                                                vDebug("");
                                                               
                                                                //a dipendenza del nome del nodo (del dettaglio) settiamo il relativo valore nell'oggetto
                                                                if(nodeName.equals("nome"))
                                                                        newNote.setNome(nodeValue);
                                                               
                                                                if(nodeName.equals("cognome"))
                                                                        newNote.setCognome(nodeValue);
                                                               
                                                                if(nodeName.equals("data"))
                                                                        newNote.setData(nodeValue);
                                                               
                                                                if(nodeName.equals("citta"))
                                                                        newNote.setCitta(nodeValue);
                                                               
                                                                if(nodeName.equals("patologia"))
                                                                        newNote.setPatologia(nodeValue);
                                                               
                                                               
                                                        }
                                               
                                        }
                                        vDebug("");
                               
                                        parsedData.add(newNote); //aggiungiamo il nostro oggetto all'arraylist
                                }
                                                                                               
                        }                      
                //gestione eccezioni
                } catch (SAXException e) {
                        eDebug(e.toString());
                } catch (IOException e) {
                        eDebug(e.toString());
                } catch (ParserConfigurationException e) {
                        eDebug(e.toString());
                } catch (FactoryConfigurationError e) {
                        eDebug(e.toString());
                }
               
        }
   
}

e Mynote.java
Codice (Java): [Seleziona]
package com.ing;


public class MyNote {
        private String patologia;
        private String nome;
        private String cognome;
        private String data;
        private String id;
        private String citta;
       
        public String getId() {
                return id;
        }

        public void setId(String id) {
                this.id = id;
        }

        public String getNome() {
                return nome;
        }

        public void setNome(String nome) {
                this.nome = nome;
        }

        public String getCognome() {
                return cognome;
        }

        public void setCognome(String cognome) {
                this.cognome = cognome;
        }

        public String getData() {
                return data;
        }

        public void setData(String data) {
                this.data = data;
        }

        public String getCitta()
        {
                return citta;
        }
        public void setCitta(String citta){
        this.citta = citta;
        }
       
        public String getPatologia() {
                return patologia;
        }

        public void setPatologia(String patologia) {
                this.patologia = patologia;
        }

        @Override
        public String toString() {
                return  "Paziente numero " + id +
                                "\n\n Nome Cognome = " + nome+"  "  +  cognome +
                                "\n Nato il  " + data + " a " + citta +
                                "\nAffetto da Patologia = " + patologia + "\n\n\n\n";
        }
}