只要为
SAX
提供实现
ContentHandler
接口的类,那么该类就可以得到通知事件(实际上就是
SAX
调用了该类中的
回调方法)。因为
ContentHandler
是一个接口,在使用的时候可能会有些不方便,因此,
SAX
还为其制定了
一个
Helper
类:
DefaultHandler
,它实现了这个接口,但是其所有的方法体都为空,在实现的时候,你只需
要继承这个类,然后重载相应的方法即可。使用
SAX
解析
itcast.xml
的代码如下:
public static List<Person> readXML(InputStream inStream) {
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();
saxParser.parse(inStream, handler);
inStream.close();
return handler.getPersons();
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
SAX
支持已内置到
JDK1.5
中,你无需添加任何的
jar
文件。关于
XMLContentHandler
的代码实现请看本页下面备
注。
l
AndroidManifest.xml:
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.gao.xml" 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=".XMLParser" 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> <uses-permission android:name="android.permission.RUN_INSTRUMENTATION" /> <instrumentation android:name="android.test.InstrumentationTestRunner" android:targetPackage="com.gao" android:label="Test for my app" /> </manifest>
com.gao.domain.Person.java:
package com.gao.domain; public class Person { private Integer id; private String name; private Integer age; public Person() { // TODO Auto-generated constructor stub } public Person(String name, Integer age) { super(); this.name = name; this.age = age; } @Override public String toString() { return "id:"+id+",name:"+name+",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 Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } }
com.gao.service.SAXPersonService.java:
package com.gao.service; import java.io.InputStream; import java.util.List; import javax.xml.parsers.SAXParser; import javax.xml.parsers.SAXParserFactory; import com.gao.domain.Person; public class SAXPersonService { public static List<Person> readXML(InputStream inputStream) throws Exception{ SAXParserFactory saxParserFactory=SAXParserFactory.newInstance(); SAXParser saxParser=saxParserFactory.newSAXParser(); XMLContentHandler contentHandler=new XMLContentHandler(); saxParser.parse(inputStream, contentHandler); inputStream.close(); return contentHandler.getPersons(); } }
com.gao.service.XMLContentHandler.java:
package com.gao.service; 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.gao.domain.Person; public class XMLContentHandler extends DefaultHandler{ private List<Person> persons; private Person person; private String preTag; public List<Person> getPersons() { return persons; } @Override public void characters(char[] ch, int start, int length) throws SAXException { if (person!=null) { String data=new String(ch,start,length); if ("name".equals(preTag)) { person.setName(data); }else if ("age".equals(preTag)) { person.setAge(new Integer(data)); } } } @Override public void startDocument() throws SAXException { persons=new ArrayList<Person>(); } @Override public void startElement(String uri, String localName, String name, Attributes attributes) throws SAXException { if ("person".equals(localName)) { person=new Person(); person.setId(new Integer(attributes.getValue("id"))); } preTag=localName; } @Override public void endElement(String uri, String localName, String name) throws SAXException { if ("person".equals(localName)&&person!=null) { persons.add(person); person=null; } preTag=null; } }
com.gao.test.SAXPersonServiceTest.java:
package com.gao.test; import java.io.InputStream; import java.util.List; import android.test.AndroidTestCase; import android.util.Log; import com.gao.domain.Person; import com.gao.service.SAXPersonService; public class SAXPersonServiceTest extends AndroidTestCase{ private static final String TAG = "SAXPersonServiceTest"; public SAXPersonServiceTest() { // TODO Auto-generated constructor stub } public void testReadXML() throws Exception { InputStream inputStream=SAXPersonServiceTest.class.getClassLoader().getResourceAsStream("gao.xml"); List<Person> persons=SAXPersonService.readXML(inputStream); for (Person person : persons) { Log.i(TAG, person.toString()); } } }
gao.xml:
<?xml version="1.0" encoding="UTF-8"?> <persons> <person id="12"> <name>Gao</name> <age>23</age> </person> <person id="34"> <name>高</name> <age>34</age> </person> </persons>
刚开始进行单元测试的时候老是出现:
[2011-02-27 12:42:58 - XMLParser] Launching instrumentation android.test.InstrumentationTestRunner on device emulator-5554
[2011-02-27 12:42:58 - XMLParser] Collecting test information
[2011-02-27 12:43:20 - XMLParser] Test run failed: Unable to find instrumentation target package: com.gao.test
原来是自己刚开始在AndroidManifest.xml里面配置单元测试的时候包写错了:
<instrumentation android:name="android.test.InstrumentationTestRunner"
android:targetPackage="com.gao.test" android:label="Test for my app" />
包多加了一个test