android xml defaulthandler解析,用DefaultHandler解析XML的Demo

0818b9ca8b590ca3270a3433284dd417.png

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> 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>();

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 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 map = new HashMap();

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 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 persons);

}

private MyDefaultHandlerObserver mObser = null;

public ArrayList 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();

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;

}

}

}

代码下载:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值