读书人

应用SAX读取XML文件

发布时间: 2012-09-24 13:49:42 作者: rapoo

使用SAX读取XML文件

?

}?4.Sax解析XML的事件处理类:package com.jbridge.xml.service;
import java.io.InputStream;import java.util.ArrayList;import java.util.List;import javax.xml.parsers.SAXParser;import javax.xml.parsers.SAXParserFactory;
import org.xml.sax.Attributes;import org.xml.sax.SAXException;import org.xml.sax.helpers.DefaultHandler;
import com.jbridge.xml.domain.Person;
public class SAXPersonService {public List<Person> getSAXPersons(InputStream inStream) throws Exception{SAXParserFactory factory = SAXParserFactory.newInstance();SAXParser parser = factory.newSAXParser();//创建解析器//设置解析器的相关特性,http://xml.org/sax/features/namespaces = true 表示开启命名空间特性,这个可以不写 ?//saxParser.setProperty("http://xml.org/sax/features/namespaces",true);PersonHandler handler = new PersonHandler();parser.parse(inStream, handler);inStream.close();return handler.getPersons();}private final class PersonHandler extends DefaultHandler{private List<Person> persons = null;private Person person = null;private String tag = null;//当前解析的元素标签
public List<Person> getPersons() {return persons;}/**?? ? ? ? * ? ? ?接收文档的开始的通知。?? ? ? ? */@Overridepublic void startDocument() throws SAXException {persons = new ArrayList<Person>();} ? ? /**?? ? ? ? * ? ? 接收元素开始的通知。?? ? ? ? * ?namespaceURI:元素的命名空间?? ? ? ? * ?localName:元素的本地名称(不带前缀)?? ? ? ? * ?qName:元素的限定名(带前缀)?? ? ? ? * ? ? atts:元素的属性集合?? ? ? ? */@Overridepublic void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {if("person".equals(localName)){person = new Person();person.setId(new Integer(attributes.getValue(0)));}tag = localName;} ? ?/**?? ? ? ? * ? ? ?接收字符数据的通知。?? ? ? ? */@Overridepublic void characters(char[] ch, int start, int length) throws SAXException {if(tag!=null){String textdata = new String(ch, start, length);if("name".equals(tag)){person.setName(textdata);}else if("age".equals(tag)){person.setAge(new Short(textdata));}}}
?? ? ? ?/**?? ? ? ? * ? ? ?接收文档的结尾的通知。?? ? ? ? * ? ? uri:元素的命名空间?? ? ? ? * ? ? localName:元素的本地名称(不带前缀)?? ? ? ? * ? ? name:元素的限定名(带前缀)?? ? ? ? */@Overridepublic void endElement(String uri, String localName, String qName)throws SAXException {if("person".equals(localName)){persons.add(person);person = null;}tag = null;}}
}??5.编写测试Sax解析XML的类(测试要配置AndroidManifest.xml)package com.jbridge.xml.activity;?import java.io.InputStream;import java.util.List;
import com.jbridge.xml.domain.Person;import com.jbridge.xml.service.SAXPersonService;
import android.test.AndroidTestCase;import android.util.Log;
public class TestService extends AndroidTestCase {private static final String TAG = "PersonServiceTest";
public void testGetSAXPersons() throws Exception {
InputStream inputStream = TestService.class.getClassLoader().getResourceAsStream("person.xml");SAXPersonService saxPersonService = new SAXPersonService();List<Person> persons = saxPersonService.getSAXPersons(inputStream);inputStream.close();for (Person person : persons) {Log.i(TAG, person.toString());}
}}??6.运行测试类其他代码见附件。

?


读书人网 >XML SOAP

热点推荐