您的位置:首页 > 其它

用DefaultHandler解析XML的Demo

2013-02-25 17:12 211 查看


MainActivity类

package com.example.xmlparsertest;

import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;

import org.xml.sax.InputSource;
import org.xml.sax.XMLReader;

import com.example.xmlparsertest.MyDefaultHandler.MyDefaultHandlerObserver;
import com.example.xmlparsertest.MyDefaultHandler.Person;
import android.os.AsyncTask;
import android.os.Bundle;
import android.app.Activity;
import android.util.Log;
import android.view.Menu;
import android.widget.ListView;
import android.widget.ProgressBar;
import android.widget.SimpleAdapter;
import android.widget.TextView;

public class MainActivity extends Activity
{
private final static String TAG = "MainActivity";

private ListView mListView = null;
private SimpleAdapter mAdapter = null;
private List<HashMap<String, Object>> mListViewData = null;
private ProgressBar mProg = null;
private TextView mTextView = null;
private MyAyntask mTask;

@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
findView();
initUI();
mTask = new MyAyntask();
mTask.execute("");
}

private void findView()
{
mListView = (ListView) findViewById(R.id.listView1);
mProg = (ProgressBar) findViewById(R.id.progressBar1);
mTextView = (TextView) findViewById(R.id.textView1);
}

private void initUI()
{
mListViewData = new ArrayList<HashMap<String, Object>>();
mAdapter = new SimpleAdapter(this, mListViewData, R.layout.listview,
new String[] { "name", "age" }, new int[] { R.id.textView1,
R.id.textView2 });
mListView.setAdapter(mAdapter);
}

@Override
public boolean onCreateOptionsMenu(Menu menu)
{
getMenuInflater().inflate(R.menu.activity_main, menu);
return true;
}

/**
*
* @author Feishin
* class MyAyntask 子线程解析XML文件,并在UI线程中更新数据
*
*/
class MyAyntask extends AsyncTask<String, Person, Void> implements
MyDefaultHandlerObserver
{

int mTempProgress = 0;//模拟的progeress,测试用

/**
* 子线程
* XML解析
*/
@Override
protected Void doInBackground(String... params)
{
Log.d(TAG, "===========doInBackground=============");
SAXParserFactory saxParserFactory = SAXParserFactory.newInstance();
SAXParser saxParser;
InputStream in = null;
try
{
saxParser = saxParserFactory.newSAXParser();
XMLReader xmlReader;
xmlReader = saxParser.getXMLReader();
MyDefaultHandler xmlHandler = new MyDefaultHandler();
xmlHandler.addObserver(this);
xmlReader.setContentHandler(xmlHandler);
in = getAssets().open("person.xml");
xmlReader.parse(new InputSource(in));
} catch (Exception e)
{
e.printStackTrace();
Log.e(TAG, "EXCEPTION ACCOUR");
} finally
{
if (in != null)
{
try
{
in.close();
} catch (IOException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
return null;
}

/**
* 主线程
* 更新UI。
* 当调用publishProgress时此方法被调用,此方法不能主动调用
*
*/
@Override
protected void onProgressUpdate(Person... values)
{
// TODO Auto-generated method stub
super.onProgressUpdate(values);
Log.d(TAG, "===========onProgressUpdate=============");
Person p = null;
if (values == null)
{
return;
} else
{
p = values[0];
}
mTempProgress = mTempProgress + 10;
HashMap<String, Object> map = new HashMap<String, Object>();
map.put("name", p.getName());
map.put("age", p.getAge());
mListViewData.add(map);
mAdapter.notifyDataSetChanged();
mProg.setProgress(mTempProgress);
}
/**
* 主线程
* 当MyAyntask执行完毕时调用
*/
@Override
protected void onPostExecute(Void result)
{
Log.d(TAG, "===========onPostExecute=============");
super.onPostExecute(result);
mAdapter.notifyDataSetChanged();
mTextView.setText("结束");
mTempProgress = 100;
mProg.setProgress(mTempProgress);
}
/**
* 主线程
* 当MyAyntask准备执行时调用
*/
@Override
protected void onPreExecute()
{
Log.d(TAG, "===========onPreExecute=============");

// TODO Auto-generated method stub
super.onPreExecute();
mTextView.setText(".....Loading.....");
mTempProgress = 0;
mProg.setProgress(mTempProgress);
mListViewData.clear();

}
//MyDefaultHandler类的监听回调
@Override
public void stepUpdate(Person person)
{
// TODO Auto-generated method stub
Log.d(TAG, "===========stepUpdate=============");
MyAyntask.this.publishProgress(person);
}

@Override
public void finished(ArrayList<Person> persons)
{

}

}

}


MyDefaultHandler类

package com.example.xmlparsertest;

import java.util.ArrayList;

import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;

import android.util.Log;
/**
*
* @author Feishin
* class MyDefaultHandler : XML解析的类
*
*/
public class MyDefaultHandler extends DefaultHandler
{
private final static String TAG = "MyDefaultHandler";
/**
*
* @author Feishin
*
* 自己封装的MyDefaultHandler,主要是为了进度反馈
*
*/
public interface MyDefaultHandlerObserver
{
void stepUpdate(Person person);

void finished(ArrayList<person> persons);
}

private MyDefaultHandlerObserver mObser = null;
public ArrayList<person> persons = null;
private Person person = null;
String elementsTag = null;

public void addObserver(MyDefaultHandlerObserver aMyDefaultHandlerObserver)
{
mObser = aMyDefaultHandlerObserver;
}
/**
* 获取节点的值
*/
@Override
public void characters(char[] ch, int start, int length)
throws SAXException
{
super.characters(ch, start, length);
String value = new String(ch, start, length);
Log.d(TAG, value);
if (person != null && elementsTag != null)
{
if ("age".equalsIgnoreCase(elementsTag))
{
int age = Integer.parseInt(value);
person.setAge(age);
elementsTag = null;
}
if ("name".equalsIgnoreCase(elementsTag))
{
person.setName(value);
elementsTag = null;
}

}

}
/**
* XML全部解析完毕时调用
*
*/
@Override
public void endDocument() throws SAXException
{
// TODO Auto-generated method stub
super.endDocument();
if (mObser != null)
{
mObser.finished(persons);
}
}
/**
* XML开始解析时调用
*
*/
@Override
public void startDocument() throws SAXException
{
// TODO Auto-generated method stub
super.startDocument();
}
/**
* 遇到结束标签时调用
*/
@Override
public void endElement(String uri, String localName, String qName)
throws SAXException
{
super.endElement(uri, localName, qName);
Log.e(TAG, localName);
if (localName.equalsIgnoreCase("person"))
{
persons.add(person);
if (mObser != null)
{
mObser.stepUpdate(person);
try
{
Thread.sleep(2000);
} catch (InterruptedException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
}
person = null;

}

}
/**
* 解析元素节点
*/
@Override
public void startElement(String uri, String localName, String qName,
Attributes attributes) throws SAXException
{
super.startElement(uri, localName, qName, attributes);
Log.i(TAG, localName);
if (localName.equalsIgnoreCase("persons"))
{
if (null == persons)
persons = new ArrayList<mydefaulthandler person="">();
else
persons.clear();
} else if (localName.equalsIgnoreCase("person"))
{
person = new Person();
int id = Integer.parseInt(attributes.getValue("id"));
person.setId(id);
} else if (localName.equalsIgnoreCase("age"))
{
elementsTag = "age";
} else if (localName.equalsIgnoreCase("name"))
{
elementsTag = "name";
}

}
/**
*
* @author Feishin
*
*/
public static class Person
{
private int age;
private String name;
private int id;

public Person()
{

}

public int getAge()
{
return age;
}

public void setAge(int age)
{
this.age = age;
}

public String getName()
{
return name;
}

public void setName(String name)
{
this.name = name;
}

public int getId()
{
return id;
}

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

}

}

代码下载:

源代码下载
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: