在Android中读取节点XML

时间:2014-02-25 15:16:30

标签: java android xml feed

我是新手,我正在尝试从XML互联网收集所有数据,到目前为止一切正常但无法找到解决方案来捕捉“dia”标签的“fecha”属性并打印出来在TextView上。谁能帮我?还有一个问题,我如何在textview中打印这些值?

<temperatura> 
<maxima> 14 </ maxima> 
<minima> 5 </ minima> 
<dato hora="06"> 6 </ dato > 
<dato hora="12"> 12 </ dato > 
<dato hora="18"> 13 </ dato > 
<dato hora="24"> 10 </ dato > 
</ temperatura>

XML:

<prediccion>
<dia fecha="2014-02-25">
<prob_precipitacion periodo="00-24"/>
<prob_precipitacion periodo="00-12"/>
<prob_precipitacion periodo="12-24">15</prob_precipitacion>
<prob_precipitacion periodo="00-06"/>
<prob_precipitacion periodo="06-12">0</prob_precipitacion>
<prob_precipitacion periodo="12-18">5</prob_precipitacion>
<prob_precipitacion periodo="18-24">0</prob_precipitacion>
<cota_nieve_prov periodo="00-24"/>
<cota_nieve_prov periodo="00-12"/>
<cota_nieve_prov periodo="12-24"/>
<cota_nieve_prov periodo="00-06"/>
<cota_nieve_prov periodo="06-12"/>
<cota_nieve_prov periodo="12-18"/>
<cota_nieve_prov periodo="18-24"/>
<estado_cielo periodo="00-24" descripcion=""/>
<estado_cielo periodo="00-12" descripcion=""/>
<estado_cielo periodo="12-24" descripcion="Muy nuboso">15</estado_cielo>
<estado_cielo periodo="00-06" descripcion=""/>
<estado_cielo periodo="06-12" descripcion="Poco nuboso">12</estado_cielo>
<estado_cielo periodo="12-18" descripcion="Muy nuboso">15</estado_cielo>
<estado_cielo periodo="18-24" descripcion="Cubierto">16n</estado_cielo>
<viento periodo="00-24">...</viento>
<viento periodo="00-12">...</viento>
<viento periodo="12-24">...</viento>
<viento periodo="00-06">...</viento>
<viento periodo="06-12">...</viento>
<viento periodo="12-18">
<direccion>SO</direccion>
<velocidad>10</velocidad>
</viento>
<viento periodo="18-24">...</viento>
<racha_max periodo="00-24"/>
<racha_max periodo="00-12"/>
<racha_max periodo="12-24"/>
<racha_max periodo="00-06"/>
<racha_max periodo="06-12"/>
<racha_max periodo="12-18"/>
<racha_max periodo="18-24"/>
<temperatura>
<maxima>14</maxima>
<minima>5</minima>
<dato hora="06">6</dato>
<dato hora="12">12</dato>
<dato hora="18">13</dato>
<dato hora="24">10</dato>
</temperatura>
<sens_termica>...</sens_termica>
<humedad_relativa>
<maxima>100</maxima>
<minima>65</minima>
<dato hora="06">95</dato>
<dato hora="12">65</dato>
<dato hora="18">75</dato>
<dato hora="24">100</dato>
</humedad_relativa>
<uv_max>3</uv_max>
</dia>
<dia fecha="2014-02-26">
...
</dia>

RSSReader.java

public class RSSReader {
    DefaultHttpClient httpClient = new DefaultHttpClient();

    public Document getRSSFromServer(String url) {
        Document response = null;
        response = getDomFromXMLString(getFeedFromServer(url));
        return response;
    }

    private String getFeedFromServer(String url) {
        String xml = null;
        if (android.os.Build.VERSION.SDK_INT > 9) {
            StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder()
                    .permitAll().build();
            StrictMode.setThreadPolicy(policy);
        }
        try {
            HttpGet httpget =new HttpGet(url);
            //HttpPost httpPost = new HttpPost(url);
            HttpResponse httpResponse = httpClient.execute(httpget);
            HttpEntity httpEntity = httpResponse.getEntity();
            xml = EntityUtils.toString(httpEntity);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return xml;
    }

    private Document getDomFromXMLString(String xml) {
        Document doc = null;
        DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
        try {
            DocumentBuilder db = dbf.newDocumentBuilder();
            InputSource is = new InputSource();
            is.setCharacterStream(new StringReader(xml));
            doc = db.parse(is);

        } catch (Exception e) {
        }
        return doc;
    }

    public String getValue(Element item, String key) {
        NodeList nodeList = item.getElementsByTagName(key);
        return this.getElementValue(nodeList.item(0));
    }

    public final String getElementValue(Node node) {
        Node child;
        if (node != null) {
            if (node.hasChildNodes()) {
                for (child = node.getFirstChild(); child != null; child = child
                        .getNextSibling()) {
                    if (child.getNodeType() == Node.TEXT_NODE) {
                        return child.getNodeValue();
                    }
                }
            }
        }
        return "";
    }
}

MainActivity.java

String key_items = "dia"; //dia
String key_title = "prob_precipitacion"; //prob_precipitacion
String key_description = "estado_cielo"; //estado_cielo
String key_link = "viento"; //viento
String key_date = "temperatura"; //temperatura
//humedad_relativa ¿HORA?
String key_max = "maxima"; //max
String key_min = "minima"; //min
String key_hour = "hora"; //dato / Hora
String key_fecha = "fecha";
ListView lstPost = null;
List<HashMap<String, Object>> post_lists = new ArrayList<HashMap<String, Object>>();
List<String> lists = new ArrayList<String>();
ArrayAdapter<String> adapter = null;
RSSReader rssfeed = new RSSReader();

public void onCreate(Bundle savedInstanceState) {...}


private class downloadWeather extends AsyncTask<Void, Void, Void>{
    @Override
    protected void onPreExecute() {
        super.onPreExecute();
        progressDialog = new ProgressDialog(MainActivity.this);
        progressDialog.setMessage("Cargando tiempo actual...");
        progressDialog.setIndeterminate(false);
        progressDialog.show();
    }

    @Override
    protected Void doInBackground(Void... params) {
        return null;
    }

    @Override
    protected void onPostExecute(Void args) {

        lstPost = (ListView) findViewById(R.id.listaaa);
        adapter = new ArrayAdapter<String>(MainActivity.this,R.layout.weather_item, R.id.TextView02, lists) {
            @Override
            public View getView(int position, View convertView, ViewGroup parent) {
                View view = super.getView(position, convertView, parent);

                // horaaemet // maxaemet // minaemet // fechaaemet // imgaemet // probabiaemet
                TextView txt1 = (TextView) view.findViewById(R.id.probabiaemet);
                TextView txt2 = (TextView) view.findViewById(R.id.horaaemet);
                TextView txt3 = (TextView) view.findViewById(R.id.maxaemet);
                TextView txt4 = (TextView) view.findViewById(R.id.minaemet);
                TextView txt5 = (TextView) view.findViewById(R.id.fechaaemet);
                ImageView txt6 = (ImageView) view.findViewById(R.id.imgaemet);

                HashMap<String, Object> data = post_lists.get(position);
                txt1.setText(data.get(key_title).toString());
                txt3.setText(data.get(key_max).toString());
                txt4.setText(data.get(key_min).toString());
                //txt5.setText(data.get(key_fecha).toString());

                return view;
            }

        };
        Document xmlFeed = rssfeed.getRSSFromServer("http://www.aemet.es/xml/municipios/localidad_41065.xml"); //http://beta.studentitzone.com/rssfeed
        NodeList nodes = xmlFeed.getElementsByTagName("dia");

        for (int i = 0; i < nodes.getLength(); i++) {
            Element item = (Element) nodes.item(i);
            HashMap<String, Object> feed = new HashMap<String, Object>();
            feed.put(key_title, rssfeed.getValue(item, key_title));
            feed.put(key_max, rssfeed.getValue(item, key_max)+"º");
            feed.put(key_min, rssfeed.getValue(item, key_min)+"º");
            post_lists.add(feed);
            lists.add(feed.get(key_title).toString());
        //Log.e("VALOR -> ", "attribute value = " + item.getAttribute( "fecha" ) );
                    //It's works. Show Attribute but, How I can put this result in a textview?
        }
        lstPost.setAdapter(adapter);
        progressDialog.dismiss();
    }
}

0 个答案:

没有答案