android使用sax解析xml

7 篇文章 0 订阅
1 篇文章 0 订阅

随着技术的发展,现在的web已经和以前不同了。web已经逐渐像移动的方向倾斜,作为程序员的确应该拓展一下自己的知识层面。学习各方面的知识,今天就接着前几天的弄一下android的xml解析,这次就使用sax的方式解析xml.下面就一步一步的来做吧。

1.编写一个简单的xml

<?xml version="1.0" encoding="UTF-8"?>
<persons>
  <person id="01">
     <name>will</name>
     <age>21</age>
  </person>
  <person id="02">
     <name>will2</name>
     <age>22</age>
  </person>
</persons>


 

2.编写pojo类

package org.lxh.vo;

public class Person {
	
	private String id;
	private String name;
	private int age;

	

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

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

	public int getAge() {
		return age;
	}

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

	public String getId() {
		return id;
	}

	public void setId(String id) {
		this.id = id;
	}
}


3.写一个解析xml的类

package org.lxh.impl;

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

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

import org.lxh.vo.Person;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;

import android.util.Log;

public class Parse {
	public List<Person> findAll(InputStream in) throws Exception {

		SAXParserFactory factory = SAXParserFactory.newInstance(); //创建解析工厂
		SAXParser parser = factory.newSAXParser();
		ParsePerson chuli = new ParsePerson();
		parser.parse(in, chuli);
		in.close(); //关闭输入流
		return chuli.getData();
	}
    //开始解析xml
	public class ParsePerson extends DefaultHandler {
		List<Person> all = null;
		Person person = null;
		String flag = null;

		public List<Person> getData() {
			return all;
		}

		public void startDocument() throws SAXException {

			all = new ArrayList<Person>();  //实例化集合
		}

		public void startElement(String uri, String localName, String qName,
				Attributes attributes) throws SAXException {
			if ("person".equals(localName)) {  
				person = new Person();
				person.setId(attributes.getValue(0)); //取得id的内容
			}
			flag = localName;  //记录上一个element
		}

		public void characters(char[] ch, int start, int length)
				throws SAXException {

			if (flag != null) {  //这样做取得的值就不会重复
				String data = new String(ch, start, length);

				if ("name".equals(flag)) {

					person.setName(data);
				}
				else if ("age".equals(flag)) {

					person.setAge(Integer.parseInt(data));
				}
			}
		}

		public void endElement(String uri, String localName, String qName)
				throws SAXException {

			if ("person".equals(localName)) {
				all.add(person);
				person = null;
			}
			flag = null;
		}

	}
}

 

4.进行单元测试


 


<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
      package="org.lxh.activity"
      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=".SaxParseXmlActivity"
                  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="org.lxh.activity" android:label="TestforMyApp"/>
    
    <uses-sdk android:minSdkVersion="8" />
   
</manifest> 


 

package org.lxh.activity;

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

import org.lxh.impl.Parse;
import org.lxh.vo.Person;

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

public class Test extends AndroidTestCase{
	public static final String tag="Test";
  public void testShuchu() throws Throwable{
	  //Log.i(tag, "123");
	  Parse p=new Parse();
	  InputStream in=getClass().getClassLoader().getResourceAsStream("persons.xml");
	
	 
		List<Person> all=p.findAll(in);
		  Log.i(tag, String.valueOf(all.size()));
		Iterator<Person> it=all.iterator();
		while(it.hasNext()){
			Person person=it.next();
			
			Log.i(tag, person.toString());
		}
		
	
  }
}


 

最后来看一下运行效果图,这里最好弄个filter,控制台就没那么乱了。

点击那个绿色的加号就OK了

不知道大家有没有不理解的地方,如果有可以写评论给我。

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值