加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

01 SAX解析xml

发布时间:2020-12-16 09:37:35 所属栏目:百科 来源:网络整理
导读:第一步 创建一个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;t

第一步 创建一个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 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());
		}
	}
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读