Android SAX解析XML文件

2026-03-06 04:42:03

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

}

        

        

    }

}

声明:本网站引用、摘录或转载内容仅供网站访问者交流或参考,不代表本站立场,如存在版权或非法内容,请联系站长删除,联系邮箱:site.kefu@qq.com。
猜你喜欢