Android SAX解析XML文件
1、AndroidManifestxml:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="cn.etc.xml"
android:versionCode="1"
android:versionName="1.0">
<application android:icon="@drawable/icon" android:label="@string/app_name">
<uses-library android:name="android.test.runner" />
<activity android:name=".XMLActivity"
android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
<uses-sdk android:minSdkVersion="8" />
<instrumentation android:name="android.test.InstrumentationTestRunner"
android:targetPackage="cn.etc.xml" android:label="Tests for My App"/>
</manifest>
2、etc.xml:
<?xml version="1.0" encoding="UTF-8"?>
<persons>
<person id="23">
<name>李明</name>
<age>30</age>
</person>
<person id="20">
<name>李向梅</name>
<age>25</age>
</person>
</persons>
3、<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:id="@+id/result"
/>
</LinearLayout>
4、package cn.etc.domain;
public class Person {
//编号
private Integer id;
//姓名
private String name;
//年龄
private Short age;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Short getAge() {
return age;
}
public void setAge(Short age) {
this.age = age;
}
}
5、package cn.etc.service;
import java.io.InputStream;
import java.io.Writer;
import java.util.ArrayList;
import java.util.List;
import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlSerializer;
import android.util.Xml;
import cn.etc.domain.Person;
public class PullPersonService {
/**
* 输出xml
* @throws Exception
*/
public static void writeXml(List<Person> persons,Writer writer)throws Exception{
XmlSerializer serializer = Xml.newSerializer();
serializer.setOutput(writer);
serializer.startDocument("UTF-8", true);//<?xml version="1.0" encoding="UTF-8"?>
serializer.startTag(null, "person");
for(Person person:persons){
serializer.startTag(null, "person");
serializer.attribute(null, "id", String.valueOf(person.getId()));
serializer.startTag(null, "name");
serializer.text(person.getName());
serializer.endTag(null, "name");
serializer.startTag(null, "age");
serializer.text(person.getAge()+"");
serializer.endTag(null, "age");
serializer.endTag(null, "person");
}
serializer.endTag(null, "person");
serializer.endDocument();
writer.flush();
writer.close();
}
public static List<Person> readXML(InputStream inStream) throws Exception{
//获取数据
List<Person> persons = null;
Person person = null;
//获取解析器
XmlPullParser parser = Xml.newPullParser();
parser.setInput(inStream,"UTF-8");
int eventCode = parser.getEventType();
//不是结束文档事件就循环
while(eventCode != XmlPullParser.END_DOCUMENT){
switch (eventCode) {
case XmlPullParser.START_DOCUMENT://开始文档事件
persons = new ArrayList<Person>();
break;
case XmlPullParser.START_TAG://开始元素事件
if("person".equals(parser.getName())){
person = new Person();
person.setId(new Integer(parser.getAttributeValue(0)));
}else if("name".equals(parser.getName())){
if(person != null){
person.setName(parser.nextText());
}
}else if("age".equals(parser.getName())){
if(person != null){
person.setAge(new Short(parser.nextText()));
}
}
break;
case XmlPullParser.END_TAG://结束元素
if("person".equals(parser.getName()) && person != null){
persons.add(person);
person = null;
}
break;
}
eventCode = parser.next();
}
return persons;
}
}
6、package cn.etc.service;
import java.io.InputStream;
import java.util.List;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import cn.etc.domain.Person;
public class SAXPersonService {
public static List<Person> readXML(InputStream inStream) throws Exception{
//获取实例
SAXParserFactory spf = SAXParserFactory.newInstance();
///创建解析器
SAXParser sax = spf.newSAXParser();
XMLContentHandler handler = new XMLContentHandler();
sax.parse(inStream, handler);
inStream.close();
return handler.getPersons();
}
}
7、package cn.etc.service;
import java.util.ArrayList;
import java.util.List;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
import cn.etc.domain.Person;
public class XMLContentHandler extends DefaultHandler {
//人员信息
private List<Person> persons;
//人
private Person person;
//标记
private String perTag;
@Override
public void characters(char[] ch, int start, int length)
throws SAXException {
if(person != null){
String data = new String(ch,start,length);
if("name".equals(perTag)){
person.setName(data);
}else if("age".equals(perTag)){
person.setAge(new Short(data));
}
}
}
public List<Person> getPersons() {
return persons;
}
@Override
public void endElement(String uri, String localName, String name)
throws SAXException {
if("person".equals(localName) && person != null){
persons.add(person);
person = null;
}
perTag = null;
}
@Override
public void startDocument() throws SAXException {
persons = new ArrayList<Person>();
}
@Override
public void startElement(String uri, String localName, String name,
Attributes attributes) throws SAXException {
if("person".equals(localName)){
person = new Person();
person.setId(new Integer(attributes.getValue(0)));
}
perTag = localName;
}
}
8、package cn.etc.xml;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStreamWriter;
import java.util.List;
import android.content.Context;
import android.test.AndroidTestCase;
import android.util.Log;
import cn.etc.domain.Person;
import cn.etc.service.PullPersonService;
import cn.etc.service.SAXPersonService;
public class SAXPersonServiceTest extends AndroidTestCase {
//
private static final String TAG = "SAXPersonServiceTest";
/**
* 通过SAX解析xml
* @throws Exception
*/
public void testReadXML() throws Exception {
InputStream inStream = SAXPersonServiceTest.class.getClassLoader()
.getResourceAsStream("etc.xml");
List<Person> persons = SAXPersonService.readXML(inStream);
for(Person person:persons){
Log.i(TAG,person.getName());
}
}
/**
* 通过pull解析xml
* @throws Exception
*/
public void testReadPullXML() throws Exception {
InputStream inStream = SAXPersonServiceTest.class.getClassLoader()
.getResourceAsStream("etc.xml");
List<Person> persons = PullPersonService.readXML(inStream);
for(Person person:persons){
Log.i(TAG,person.getName()+" " +person.getAge());
}
}
/**
* 通过pull解析器 写入内容
* @throws Exception
*/
public void testPullWriteXML() throws Exception {
InputStream inStream = SAXPersonServiceTest.class.getClassLoader()
.getResourceAsStream("etc.xml");
List<Person> persons = PullPersonService.readXML(inStream);
FileOutputStream out = this.getContext().openFileOutput("persons.xml", Context.MODE_WORLD_READABLE);
OutputStreamWriter writer = new OutputStreamWriter(out,"UTF-8");
PullPersonService.writeXml(persons, writer);
}
}
9、package cn.etc.xml;
import java.io.InputStream;
import java.util.List;
import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.widget.TextView;
import android.widget.Toast;
import cn.etc.domain.Person;
import cn.etc.service.SAXPersonService;
public class XMLActivity extends Activity {
private static final String TAG = "XMLActivity";
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
//获取画布
TextView resultView = (TextView)this.findViewById(R.id.result);
InputStream inStream = XMLActivity.class.getClassLoader().getResourceAsStream("etc.xml");
try {
List<Person> persons = SAXPersonService.readXML(inStream);
StringBuilder sb = new StringBuilder();
for(Person person:persons){
sb.append(person.getName().toString()).append("\n");
sb.append(person.getAge().toString()).append("\n");
}
resultView.setText(sb);
Toast.makeText(XMLActivity.this,"解析XML成功",4).show();
} catch (Exception e) {
Log.i(TAG,e.toString());
Toast.makeText(XMLActivity.this,"解析XML失败",2).show();
}
}
}