一、首先创建一个需要解析的person.xml 文件
<?xml version="1.0" encoding="UTF-8"?>
<persons>
<person id="20">
<name>MacDroid</name>
<age>22</age>
</person>
<person id="30">
<name>Vect</name>
<age>28</age>
</person>
</persons>
二、创建Person.java用来对应解析出来的对象
public class Person {
public int id;
public String name;
public int age;
@Override
public String toString() {
return "id : " + id + " name : " + name + " age " + age;
}
}
三、这一点是关键,解析刚才创建的person.xml文件
(1)使用SAX解析方式
public class SAXParse {
public List<Person> readXml(InputStream is) {
try {
SAXParser mSAXParser = SAXParserFactory.newInstance()
.newSAXParser();
PersonHandler mPersonHandler = new PersonHandler();
mSAXParser.parse(is, mPersonHandler);
is.close();
return mPersonHandler.getPersons();
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
private final class PersonHandler extends DefaultHandler {
private List<Person> list = null;
private String tag = null;
private Person person;
@Override
public void startDocument() throws SAXException {
list = new ArrayList<Person>();
}
@Override
public void startElement(String uri, String localName, String qName,
Attributes attributes) throws SAXException {
if ("person".equals(localName)) {
person = new Person();
person.id = Integer.parseInt(attributes.getValue(0));
}
tag = localName;
}
@Override
public void endElement(String uri, String localName, String qName)
throws SAXException {
if ("person".equals(localName)) {
list.add(person);
person = null;
}
tag = null;
}
@Override
public void characters(char[] ch, int start, int length)
throws SAXException {
if (tag != null) {
String data = new String(ch, start, length);
if ("name".equals(tag)) {
person.name = data;
} else if ("age".equals(tag)) {
person.age = Integer.parseInt(data);
}
}
}
public List<Person> getPersons() {
return this.list;
}
}
}
(2)使用PULL解析方式
public class PullParse {
private List<Person> list;
public List<Person> getPersons(InputStream is) {
XmlPullParser mXmlPullParser = Xml.newPullParser();
Person person = null;
try {
mXmlPullParser.setInput(is, "UTF-8");
// 产生第一个事件
int eventType = mXmlPullParser.getEventType();
while (eventType != XmlPullParser.END_DOCUMENT) {
switch (eventType) {
case XmlPullParser.START_DOCUMENT:
list = new ArrayList<Person>();
break;
case XmlPullParser.START_TAG:
// 得到解析器当前指向元素节点的便签名
String name = mXmlPullParser.getName();
if ("person".equals(name)) {
person = new Person();
person.id = Integer.parseInt(mXmlPullParser
.getAttributeValue(0));
} else if (person != null) {
if ("name".equals(name)) {
// 得到解析器当前指向元素节点的下一个文本节点
person.name = mXmlPullParser.nextText();
} else if ("age".equals(name)) {
person.age = Integer.parseInt(mXmlPullParser
.nextText());
}
}
break;
case XmlPullParser.END_TAG:
if ("person".equals(mXmlPullParser.getName())) {
list.add(person);
person = null;
}
break;
}
eventType = mXmlPullParser.next();
}
} catch (Exception e) {
e.printStackTrace();
}
return list;
}
}
最后自己的定义Activity中测试这两种解析方式
public class SAXParseDemoActivity extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
try{
testSAXParse();
testPullParse();
}catch(Exception e){
}
}
public void testSAXParse() throws IOException {
InputStream is =this.getAssets().open("person.xml");
SAXParse mSaxParser = new SAXParse();
List<Person> list = mSaxParser.readXml(is);
Log.i("testSAXParse", "size = " + list.size());
for(Person p : list)
System.out.println(p);
}
public void testPullParse() throws IOException{
InputStream is =this.getAssets().open("person.xml");
PullParse mPullParse = new PullParse();
List<Person> list = mPullParse.getPersons(is);
Log.i("testPullParse", "size = " + list.size());
for(Person p : list)
System.out.println(p);
}
}
最后运行出来的结果:
I/System.out( 1943): id : 20 name : MacDroid age 22
I/System.out( 1943): id : 30 name : Vect age 28
I/testPullParse( 1943): size = 2
I/System.out( 1943): id : 20 name : MacDroid age 22
I/System.out( 1943): id : 30 name : Vect age 28
代码实现下载地址:http://download.youkuaiyun.com/my/uploads