主运行类
package com.mrzhu.test31; import java.io.InputStream; import java.util.List; import javax.xml.parsers.SAXParser; import javax.xml.parsers.SAXParserFactory; import android.app.Activity; import android.os.Bundle; import android.util.Log; import android.view.View; public class SAXParse extends Activity { /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); } //按钮事件 public void sax(View v){ startSax(); } private void startSax() { //获得解析器工厂 SAXParserFactory saxParserFactory = SAXParserFactory.newInstance(); try { //获得解析器 SAXParser saxParser = saxParserFactory.newSAXParser(); //装载要解析的xml文件 InputStream inputStream = getAssets().open("person.xml"); SAXHandler saxHandler = new SAXHandler(); //调用parse方法开始解析 saxParser.parse(inputStream, saxHandler); //取得解析后的结果 List<Person> list = saxHandler.getList(); for (Person person : list) { Log.i("System.out", person.toString()); } } catch (Exception e) { e.printStackTrace(); } } }
SAXHandler类:
package com.mrzhu.test31; import java.util.ArrayList; import java.util.List; import org.xml.sax.Attributes; import org.xml.sax.SAXException; import org.xml.sax.helpers.DefaultHandler; public class SAXHandler extends DefaultHandler { private List<Person> list; private Person currPerson; private String tag; public List<Person> getList() { return list; } /** * 解析到开始标记时执行该方法 */ @Override public void startDocument() throws SAXException { super.startDocument(); //实例化一个list用于存储解析出来的对象 list = new ArrayList<Person>(); } /** * 解析到开始元素时执行该方法 */ @Override public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { super.startElement(uri, localName, qName, attributes); //当开始标签为person时实例化一个Person对象 if("person".trim().equalsIgnoreCase(qName)){ currPerson = new Person(); //取得属性值 currPerson.setPersonid(attributes.getValue("personId")); } //将解析到的标签赋值给tag tag = qName; } /** * 当解析到内容时执行该方法 */ @Override public void characters(char[] ch, int start, int length) throws SAXException { super.characters(ch, start, length); if(tag != null){ //判断解析出来的标签名,则取出对应值并设置给Person对象 if("name".trim().equalsIgnoreCase(tag)){ currPerson.setName(new String(ch, start, length)); }else if("address".trim().equalsIgnoreCase(tag)){ currPerson.setAddress(new String(ch, start, length)); }else if("tel".trim().equalsIgnoreCase(tag)){ currPerson.setTel(new String(ch, start, length)); }else if("fax".trim().equalsIgnoreCase(tag)){ currPerson.setFax(new String(ch, start, length)); }else if("email".trim().equalsIgnoreCase(tag)){ currPerson.setEmail(new String(ch, start, length)); } } } /** * 当解析到结束标签时执行该方法 */ @Override public void endElement(String uri, String localName, String qName) throws SAXException { super.endElement(uri, localName, qName); //若标签名为person,则将Person对象加到list集合中 if("person".trim().equalsIgnoreCase(qName)){ list.add(currPerson); } tag = null; } /** * 当解析到结束文档标签时执行该方法 */ @Override public void endDocument() throws SAXException { super.endDocument(); } }
Person类:
package com.mrzhu.test31; public class Person { private String personid; private String name; private String address; private String tel; private String fax; private String email; public String getPersonid() { return personid; } public void setPersonid(String personid) { this.personid = personid; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getAddress() { return address; } public void setAddress(String address) { this.address = address; } public String getTel() { return tel; } public void setTel(String tel) { this.tel = tel; } public String getFax() { return fax; } public void setFax(String fax) { this.fax = fax; } public String getEmail() { return email; } public void setEmail(String email) { this.email = email; } @Override public String toString() { return "Person [name=" + name + ", address=" + address + ", tel=" + tel + ", fax=" + fax + ", email=" + email + "]"; } }
person.xml文件:
<?xml version="1.0" encoding="UTF-8"?> <people> <person personid="E01"> <name>Tony Blair</name> <address>10 Downing Street, London, UK</address> <tel>(061) 98765</tel> <fax>(061) 98765</fax> <email>[email protected]</email> </person> <person personid="E02"> <name>Bill Clinton</name> <address>White House, USA</address> <tel>(001) 6400 98765</tel> <fax>(001) 6400 98765</fax> <email>[email protected]</email> </person> <person personid="E03"> <name>Tom Cruise</name> <address>57 Jumbo Street, New York, USA</address> <tel>(001) 4500 67859</tel> <fax>(001) 4500 67859</fax> <email>[email protected]</email> </person> <person personid="E04"> <name>Linda Goodman</name> <address>78 Crax Lane, London, UK</address> <tel>(061) 54 56789</tel> <fax>(061) 54 56789</fax> <email>[email protected]</email> </person> </people>
main.xml文件:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" > <Button android:layout_width="fill_parent" android:layout_height="wrap_content" android:onClick="sax" android:text="@string/btn_sax" /> </LinearLayout>