木其网络科技专业程序员代写http://www.xmsydw.com
程序员学历擅长经验网店链接
apenny硕士ASP.NET PHP 电子 通信设计 图像 编程 网络5年进入店铺
zheng_qianqian本科C语言 C++面向对象 Java3年进入店铺
guoguanl本科Java Web项目 JSP Hibernate Struts Mysql4年进入店铺

android 之xml 解析

方法一:我们使用pull

第一步:需要解析的persons.xml

<?xml version="1.0" encoding="UTF-8"?>  
<persons>  
 <person id="23" grade="1">  
   <name>张三</name>  
   <age>30</age>   
  </person>   
  <person  grade="0" id="20">  
    <name>李四</name>  
     <age>25</age>  
  </person>  
</persons> 

第二步:编码关键Java代码

/**
	 * @param is 输入流
	 * @return 人员集合
	 * @throws Throwable
	 */
	public static List<Person> getPersons(InputStream is) throws Throwable {
		List<Person> personList = new ArrayList<Person>();
		Person person = null;
		/** pull 解析工厂 */
		XmlPullParserFactory pactory = XmlPullParserFactory.newInstance();
		/** 过生工厂获取一个pull 解析器 */
		XmlPullParser parser = pactory.newPullParser();
		/**设定字符集编码*/
		parser.setInput(is, "UTF-8");
		/** 事件类型 
		 *  读取到xml的声明返回数字0 START_DOCUMENT;
		 *  读取到xml的结束返回数字1 END_DOCUMENT ; 
		 *  读取到xml的开始标签返回数字2 START_TAG 
		 *  读取到xml的结束标签返回数字3 END_TAG
		 *  读取到xml的文本返回数字4 TEXT
		 */
		int event = parser.getEventType();

		 System.out.println("XmlPullParser.END_DOCUMENT:"+XmlPullParser.END_DOCUMENT); //返回1
		 System.out.println("XmlPullParser.START_DOCUMENT:"+ XmlPullParser.START_DOCUMENT);//返回1
		 System.out.println("XmlPullParser.END_TAG:"+XmlPullParser.END_TAG); //返回3
		while (event != XmlPullParser.END_DOCUMENT) {
			String nodeName = parser.getName();
			switch (event) {
			case XmlPullParser.START_DOCUMENT:
				break;
			case XmlPullParser.START_TAG:
				if ("person".equals(nodeName)) {
					person = new Person();
					person.setId(Integer.valueOf(parser.getAttributeValue(null,"id")));
					person.setGrade(Integer.valueOf(parser.getAttributeValue(null,"grade")));
				} else if ("name".equals(nodeName)) {
					person.setName(parser.nextText());
				} else if ("age".equals(nodeName)) {
					person.setAge(Integer.valueOf(parser.nextText()));
				}
				break;
			case XmlPullParser.END_TAG:
				if ("person".equals(nodeName)) {
					personList.add(person);
				}
				break;

			default:
				break;
			}

			event = parser.next();
		}
		return personList;
	}

pull  也可以解析文本内容。

	parser.setInput(new StringReader("<?xml version=\"1.0\" encoding=\"UTF-8\"?><persons><person id=\"23\" grade=\"1\"><name>张三</name><age>30</age><image>zs</image></person><person  grade=\"0\" id=\"20\"><name>李四</name><age>25</age><image>ls</image> </person></persons> "));

第三步:编写测试代码。并申请测试权限

public class MyPullTest extends AndroidTestCase {


	public void testPersonsPull(){
		InputStream is = Thread.currentThread().getContextClassLoader().getResourceAsStream("persons.xml");
		try {
			List<Person> personList =  PullDemoActivity.getPersons(is);
			for (Person p : personList) {
				System.out.println(p.toString());
			}
		} catch (Throwable e) {
			e.printStackTrace();
		}
	}
}


AndroidManifest.xml

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

    <application android:icon="@drawable/icon" android:label="@string/app_name">
     <uses-library android:name="android.test.runner" />
        <activity android:name=".PullDemoActivity"
                  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.hkrt.action" android:label="Tests for My App" />
  <uses-permission android:name="android.permission.INTERNET"/>
</manifest>

注:targetPackage="设到启动的Activity包下"


结果图:


方法二:我们使用SAX 解析。

XMLContentHandler.java

package com.hkrt.action;

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 com.hkrt.domain.Person;

public class XMLContentHandler extends DefaultHandler {


	private List<Person> persons = null;
	private Person currentPerson;
	private String tagName = null;//当前解析的元素标签

	public List<Person> getPersons() {
		return persons;
	}
	/*
	 * 接收文档的开始的通知。
	 */
	@Override public void startDocument() throws SAXException {
		persons = new ArrayList<Person>();
	}
	/*
	 * 接收字符数据的通知。
	 */
	@Override public void characters(char[] ch, int start, int length) throws SAXException {
		if(tagName!=null){
			String data = new String(ch, start, length);
			if(tagName.equals("name")){
				this.currentPerson.setName(data);
			}else if(tagName.equals("age")){
				this.currentPerson.setAge(Short.parseShort(data));
			}
		}
	}
	/*
	 * 接收元素开始的通知。
	 * 参数意义如下:
	 *    namespaceURI:元素的命名空间
	 *    localName :元素的本地名称(不带前缀)
	 *    qName :元素的限定名(带前缀)
	 *    atts :元素的属性集合
	 */
	@Override public void startElement(String namespaceURI, String localName, String qName, Attributes atts) throws SAXException {
		if(localName.equals("person")){
			currentPerson = new Person();
			currentPerson.setId(Integer.parseInt(atts.getValue("id")));
			currentPerson.setGrade(Integer.parseInt(atts.getValue("grade")));
		}
		this.tagName = localName;
	}
	/*
	 * 接收文档的结尾的通知。
	 * 参数意义如下:
	 *    uri :元素的命名空间
	 *    localName :元素的本地名称(不带前缀)
	 *    name :元素的限定名(带前缀)
	 * 
	 */
	@Override public void endElement(String uri, String localName, String name) throws SAXException {
		if(localName.equals("person")){
			persons.add(currentPerson);
			currentPerson = null;
		}
		this.tagName = null;
	}
}

测试:

public void testPersonsSax(){
		InputStream inStream = Thread.currentThread().getContextClassLoader().getResourceAsStream("persons.xml");
		   try {
				SAXParserFactory spf = SAXParserFactory.newInstance();
				SAXParser saxParser = spf.newSAXParser(); //创建解析器
				//设置解析器的相关特性,http://xml.org/sax/features/namespaces = true 表示开启命名空间特性  
				//saxParser.setProperty("http://xml.org/sax/features/namespaces",true);
				XMLContentHandler handler = new XMLContentHandler();
				//File file = new File("解析内容");
				//saxParser.parse(file, handler);
				saxParser.parse(inStream, handler);
				inStream.close();
				List<Person> personList = handler.getPersons();
				for (Person p : personList) {
					System.out.println("sax解析:"+p.toString());
				}
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

结果图:


在应用中,具体用那个,那一个更好。请查看具体的资料。在此不多做描述。总之能用pull 就用pull。

posted @ 2011-10-31 16:12  C语言程序  阅读(229)  评论(0编辑  收藏  举报
木其网络科技专业程序员代写http://www.xmsydw.com
程序员学历擅长经验网店链接
apenny硕士ASP.NET PHP 电子 通信设计 图像 编程 网络5年进入店铺
zheng_qianqian本科C语言 C++面向对象 Java3年进入店铺
guoguanl本科Java Web项目 JSP Hibernate Struts Mysql4年进入店铺