Android DOM 解析

package com.jerry.earthquake;

import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLConnection;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.GregorianCalendar;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;

import android.app.ListFragment;
import android.location.Location;
import android.os.Bundle;
import android.os.Handler;
import android.widget.ArrayAdapter;

public class EarthquakeListFragment extends ListFragment {
	//数据集
	ArrayList<Quake> earthQuakes = new ArrayList<Quake>();
	//adapter
	ArrayAdapter<Quake> adapter;
	
	Handler handler = new Handler();

	@Override
	public void onActivityCreated(Bundle savedInstanceState) {
		super.onActivityCreated(savedInstanceState);
		
		//列表项样式
		int layoutID = android.R.layout.simple_list_item_1;
		//初始化adapter
		adapter = new ArrayAdapter<Quake>(getActivity(), layoutID, earthQuakes);
		setListAdapter(adapter);
		
		Thread t = new Thread(new Runnable() {
			
			@Override
			public void run() {
				refreshEarthquakes();
			}
		});
		
		t.start();
	}

	private void refreshEarthquakes(){
		URL url;
		String quakeFeed = getString(R.string.quake_feed);
		try {
			url = new URL(quakeFeed);
			
			URLConnection connection;
			connection = url.openConnection();
			
			HttpURLConnection httpConnection = (HttpURLConnection) connection;
			int responseCode = httpConnection.getResponseCode();
			
			if(responseCode == HttpURLConnection.HTTP_OK){
				InputStream in = httpConnection.getInputStream();
				
				DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
				DocumentBuilder db = dbf.newDocumentBuilder();
				
				//分析地震源
				Document dom = db.parse(in);
				Element docEle = dom.getDocumentElement();
				
				//清除旧数据
				earthQuakes.clear();
				
				NodeList nl = docEle.getElementsByTagName("entry");
				
				if(nl != null && nl.getLength() > 0){
					for(int i = 0;i < nl.getLength() ;i++){
						Element entry = (Element) nl.item(i);
						Element title = (Element) entry.getElementsByTagName("title").item(0);
						Element g = (Element) entry.getElementsByTagName("georss:point").item(0);
						Element when = (Element) entry.getElementsByTagName("updated").item(0);
						Element link = (Element) entry.getElementsByTagName("link").item(0);
						
						String details = title.getFirstChild().getNodeValue();
						String hostname = "http://earthquake.usgs.gov";
						String linkAttr = link.getAttribute("href");
						String linkString = hostname + linkAttr;
						
						String point;
						if(null != g){
							point = g.getFirstChild().getNodeValue();
						}else{
							point = "30.111 28.666";
						}
						String dt = when.getFirstChild().getNodeValue();
						SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'hh:mm:ss'Z'");
						Date qdate = new GregorianCalendar(0, 0, 0).getTime();
						
						qdate = sdf.parse(dt);
						
						String[] location = point.split(" ");
						Location l = new Location("dummyGPS");
						l.setLatitude(Double.parseDouble(location[0]));
						l.setLongitude(Double.parseDouble(location[1]));
						
//						String magnitudeString = details.split(" ")[1];
//						int end = magnitudeString.length() - 1;
//						double magnitude = Double.parseDouble(magnitudeString.substring(0,end));
//						
//						details = details.split(",")[1].trim();
						
						final Quake quake = new Quake(qdate,details,l,3.21,linkString);
						
						//处理一个新发现的地震
						handler.post(new Runnable() {
							
							@Override
							public void run() {
								addNewQuake(quake);
							}
						});
						
					}
				}
			}
			
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	private void addNewQuake(Quake quake) {
		//将新地震添加到地震列表中
		earthQuakes.add(quake);
		
		//向 ArrayAdapter 通知改变
		adapter.notifyDataSetChanged();
	}
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值