现在的位置: 首页 > 综合 > 正文

01 SAX解析xml

2017年05月18日 ⁄ 综合 ⁄ 共 4576字 ⁄ 字号 评论关闭

第一步 创建一个Person类存放相关信息

package com.xiaoxin.xml.bean;

public class Person{
	private Integer id;
	private String name;
	private Short age;
	public Person() {
		super();
	}
	public Person(Integer id, String name, Short age) {
		super();
		this.id = id;
		this.name = name;
		this.age = age;
	}
	
	public Person(String name, Short age) {
		super();
		this.name = name;
		this.age = 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;
	}
	@Override
	public String toString() {
		return "Person [id=" + id + ", name=" + name + ", age=" + age + "]";
	}
	
	
	
}

第二步 新建一个类继承DefultHandle而DefultHandle实现了controlHandle的接口 controlHandle提供了相关的事件方法  然后在其中覆盖


startDocumnet() :当开始解析xml文件的声明的时候就会触发这个事件, 可以做一些初始化的工作


startElement() 当开始解析元素的开始标签的时候,就会触发这个事件


characters() 当读到文本元素的时候要触发这个事件.


endElement() 当读到结束标签的时候 就会触发这个事件


先看 XML文件吧,好对SAX读取的顺序有个了解

<?xml version="1.0" encoding="utf-8"?>
<span style="white-space:pre">	</span><person>

    <person id="23" >
        <name>
	NEwii
        </name>

        <age>
	21
        </age>
    </person>
    <person id="20" >
        <name>
	WiiWill
        </name>

        <age>
	25
        </age>
    </person>

</person>

package com.xiaoxin.xml;

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 android.util.Log;

import com.xiaoxin.xml.bean.Person;

public class Sax extends DefaultHandler {
	private static final String TAG="Sax";
	//用一个集合存放解析东西
	private List<Person>persons;
	private String perTag;//通过此变量 ,记录前一个标签的名称
	Person person;//记录当前Person
	
	public List<Person>getPersons(){
		return persons;
		
	}
	@Override
	public void startDocument() throws SAXException {
		persons=new ArrayList<Person>();
		Log.i(TAG, "开始解析了");
		super.startDocument();
	}
	
	/* (non-Javadoc)
	 * uri命名空间 
	 * localName 标签名称
	 * qName 戴明明空间的标签名
	 * attributes 存放该标签的所有属性
	 */
	@Override
	public void startElement(String uri, String localName, String qName,
			Attributes attributes) throws SAXException {
		//首先判断是不是我们想要的元素
		if("person".equals(localName)){
			for(int i=0;i<attributes.getLength();i++){
<span style="white-space:pre">		</span>Log.i(TAG, "attributesName:"+attributes.getLocalName(i)+"attributes_value"+attributes.getValue(i));
				//需要处理的一个对象的开始标记 所以我们在这里需要new一个person对象
				person=new Person();
				person.setId(Integer.valueOf(attributes.getValue(i)));
			}
		}
		perTag=localName;
		Log.i(TAG, "****startElement");
	}
	
	/* (non-Javadoc)
	 * ch 当前读到Textnode字节数组
	 * start 直接开始的位置
	 * lengh textnode的长度
	 * @see org.xml.sax.helpers.DefaultHandler#characters(char[], int, int)
	 */
	@Override
	public void characters(char[] ch, int start, int length)
			throws SAXException {
		String data=new String(ch,start,length).trim();
		if(!"".equals(data.trim())){
			Log.i(TAG,"content:"+data.trim());
		}
		if("name".equals(perTag)){
			person.setName(data);
		}else if("age".equals(perTag)){
			person.setAge(new Short(data));
			
		}
	}

	@Override
	public void endDocument() throws SAXException {

		Log.i(TAG,"********endDocument()******");
		
	}

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





}

然后在配置文件中 配置 测试单元

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.xiaoxin.xml"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="14"
        android:targetSdkVersion="19" />

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
      <!--   增加测试单员 -->
        <uses-library android:name="android.test.runner" />

        <activity
            android:name="com.xiaoxin.xml.MainActivity"
            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>
<!--   增加测试单员 -->
    <instrumentation
        android:name="android.test.InstrumentationTestRunner"
        android:targetPackage="com.xiaoxin.xml" >
    </instrumentation>

</manifest>

测试单员

package com.xiaoxin.xml;

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

import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;

import com.xiaoxin.xml.bean.Person;

import android.test.AndroidTestCase;
import android.util.Log;

public class PersonServiceTest extends AndroidTestCase {
	private static final String TAG = "PersonServiceTest";

	public void testSax()throws Throwable{
		//因为XML在src文件中 可以直接反射到路径 inputStream
		InputStream inputStream=this.getClass().getClassLoader().getResourceAsStream("xiaoxin.xml");
		Sax sax=new Sax();
		//建立解析工厂
		SAXParserFactory spf=SAXParserFactory.newInstance();
		//简历解析模式
		SAXParser saxParser=spf.newSAXParser();
		//导入路径 和解析方法 开始
		saxParser.parse(inputStream, sax);
		List<Person>persons=sax.getPersons();
		inputStream.close();
		for(Person person:persons){
			Log.i(TAG, person.toString());
		}
	}
}

抱歉!评论已关闭.