用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;
}
}
}
代码下载:
源代码下载
相关文章推荐
- 解析xml数据的简单demo
- Android SAX 解析XML的Demo
- java 解析xml文档之w3c模式解析demo
- 一个解析XML数据的简单Demo(以KissXml为例)
- QXmlStreamReader、QDomDocument两种方式解析XML的Demo
- 一个解析XML数据的简单Demo(以KissXml为例)
- Android 获取系统内存、保存解析xml demo
- Kissxml 解析 XML数据的简单Demo
- Demo XML 、 JSON 解析 AND 网络HTTP请求
- SAX事件解析XML文档的DefaultHandler
- iOS 解析xml之——将XML转化为树demo
- jaxp 解析xml 小demo 对xml文件标签实现增删改查crud操作
- Android实例demo7之xml保存pull解析
- Android之解析XML的三种Demo!
- stax解析XML-----Demo
- SAX解析 XML的Demo
- 160708、JQuery解析XML数据的demo
- 对组织架构xml文件orgdemo.xml进行解析
- JAVA如何使用Dom4j解析xml的DEMO案例
- DOM解析xml一个demo实例