01 SAX解析xml

来源:互联网 发布:淘宝违禁品防排查技巧 编辑:程序博客网 时间:2024/06/06 03:23

第一步 创建一个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;}@Overridepublic 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;//记录当前Personpublic List<Person>getPersons(){return persons;}@Overridepublic void startDocument() throws SAXException {persons=new ArrayList<Person>();Log.i(TAG, "开始解析了");super.startDocument();}/* (non-Javadoc) * uri命名空间  * localName 标签名称 * qName 戴明明空间的标签名 * attributes 存放该标签的所有属性 */@Overridepublic 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) */@Overridepublic 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));}}@Overridepublic void endDocument() throws SAXException {Log.i(TAG,"********endDocument()******");}@Overridepublic 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文件中 可以直接反射到路径 inputStreamInputStream 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());}}}



0 0
原创粉丝点击