XML文件的解析

Android开发过程中很多文件都是以XML格式存放的。

Android平台上可以使用Simple API for XML(SAX)Document Object Model(DOM)(不建议使用)Android附带的pull解析器解析XML文件。

方式1:使用SAX读取XML文件;它是一种解析速度快并且占内存少的xml解析器,非常适合用于Android等移动设备,SAX解析XML文件采用的是事件驱动,也就是说,它并不需要解析完整个文档,在按内容顺序解析文档的过程中,SAX会判断当前读到的字符是否符合XML语法中的某部分,如果符合就会触发事件。所谓事件,其实就是一些方法,这些方法定义在ContentHandler接口。

如要解析的文件如下

persons.xml

<?xml version="1.0" encoding="UTF-8"?>
<persons>
	<person id="23">
		<name>zhangsan</name>
		<age>30</age>
	</person>
	<person id="20">
		<name>zhangxiaoxiao</name>
		<age>25</age>
	</person>
</persons>

复习XML文件的组成部分

什么类型的节点?

ElementNode(元素节点)

TextNode(文本节点):空白也属于字符->文本节点

新建项目:SAXParserExercise

person.xml文件放入src相应的xml包里面


 

1.在实体类Person.java定义person.xml中的三个属性

package cn.bzu.entity;

public class Person {
	private Integer id;
	private String name;
	private Integer 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 Integer getAge() {
		return age;
	}

	public void setAge(Integer age) {
		this.age = age;
	}

	@Override
	public String toString() {
		return "Person [id=" + id + ", name=" + name + ", age=" + age + "]";
	}

}

2..新建SAXPersonService进行解析

package cn.bzu.service;

import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;

import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
import cn.bzu.entity.Person;

public class SAXPersonService {
	// 要解析的XML文件以流的方式传进来
	public List<Person> getPersons(InputStream istream) throws Throwable {
		SAXParserFactory saxParserFactory = SAXParserFactory.newInstance();
		SAXParser saxParser = saxParserFactory.newSAXParser();
		PersonHandler personHandler = new PersonHandler();
		saxParser.parse(istream, personHandler);
		// 当解析过程中遇到符合XML语法规定的语句时就会调用第2个参数所规定的方法
		return personHandler.getPersons();

	}

	private final class PersonHandler extends DefaultHandler {
		private List<Person> persons;
		private Person person;
		private String TAG; // 存放当前所遍历的元素节点

		@Override
		public void characters(char[] ch, int start, int length)
				throws SAXException {
			super.characters(ch, start, length);
			if (TAG != null) {
				String data = new String(ch, start, length);
				if ("name".equals(TAG)) {
					person.setName(data);
				} else if ("age".equals(TAG)) {
					person.setAge(new Integer(data));
				}
			}
		}

		@Override
		public void endDocument() throws SAXException {
			super.endDocument();

		}

		@Override
		public void endElement(String uri, String localName, String qName)
				throws SAXException {
			super.endElement(uri, localName, qName);
			if ("person".equals(localName)) {
				persons.add(person);
				person = null;
			}
			TAG = null;
		}

		// 进行一些初始化的工作
		@Override
		public void startDocument() throws SAXException {
			super.startDocument();
			persons = new ArrayList<Person>();
		}

		@Override
		public void startElement(String uri, String localName, String qName,
				Attributes attributes) throws SAXException {
			super.startElement(uri, localName, qName, attributes);
			// localName:不含命名空间前缀的标签名
			// qName:含有命名空间前缀的标签名
			// attributes:接收属性值
			if ("person".equals(localName)) {
				person = new Person();
				person.setId(new Integer(attributes.getValue(0)));
			}
			TAG = localName;
		}

		public List<Person> getPersons() {
			return persons;
		}
	}
}

3.进行单元测试SAXPersonServiceTest.java

package cn.bzu.service;

import java.io.InputStream;
import java.util.List;
import cn.bzu.entity.Person;
import android.test.AndroidTestCase;

public class SAXPersonServiceTest extends AndroidTestCase {
	public void testSAX() throws Throwable {
		SAXPersonService saxPersonService = new SAXPersonService();
		InputStream istream = getClass().getClassLoader().getResourceAsStream(
				"cn/bzu/xml/persons.xml");
		List<Person> persons = saxPersonService.getPersons(istream);
		for (Person person : persons) {
			System.out.println(person);
		}
	}
}

在测试之前需要修改AndroidManifest.xml文件如下:做标记部分

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="cn.bzu.saxparserexercise"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="8"
        android:targetSdkVersion="15" />

    <application
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <uses-library android:name="android.test.runner" />

        <activity
            android:name=".MainActivity"
            android:label="@string/title_activity_main" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

    <instrumentation
        android:name="android.test.InstrumentationTestRunner"
        android:targetPackage="cn.bzu.saxparserexercise" >
    </instrumentation>

</manifest>


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值