Android SAX,DOM,PULL解析XML文档

来源:互联网 发布:慕清明知乎 编辑:程序博客网 时间:2024/05/03 07:27

一,写XML

<?xml version="1.0" encoding="utf-8" ?><class><student id="ACCP001"><name>XiaoYang</name><age>19</age></student><student id="ACCP002"><name>XiaoZhang</name><age>28</age></student><student id="ACCP003"><name>XiaoZhao</name><age>38</age></student></class>

二,编写对应XML的bean类

package sn.len.saxparser.domain;public class StudentBean {private String numberId=null;private String name=null;private Integer age=null;public String getNumberId() {return numberId;}public void setNumberId(String numberId) {this.numberId = numberId;System.out.println(this.numberId);}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;}public String toString(){return "Person [age=" + age + ", id=" + numberId + ", name=" + name + "]";  }}


三,分别写SAXParserService.java DomParserService.java PullParserService类

先看一下目录结构。见图


//SAXParserService.java类SAX解析

package sn.len.saxparser.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 sn.len.saxparser.domain.StudentBean;public class SAXParserService {public List<StudentBean> getParsers(InputStream inStream) throws Throwable{//SAX获取工厂实例SAXParserFactory factory=SAXParserFactory.newInstance();//通过工厂实例得到SAX解析对象SAXParser parser=factory.newSAXParser();//实例内部类PersonParser personParser=new PersonParser();//解析指定的输入流,当你解析的时候就会自动调用StudentBean中的方法parser.parse(inStream, personParser);//关闭流inStream.close();//返回读取结果return personParser.getPerson();}//内部类private final class PersonParser extends DefaultHandler{private List<StudentBean> person=null;private String tag=null;StudentBean sb=null;//返回Listpublic List<StudentBean> getPerson(){return person;}//文档开始@Overridepublic void startDocument() throws SAXException {person=new ArrayList<StudentBean>();}//元素开始@Overridepublic void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {if("student".equals(localName)){sb=new StudentBean();sb.setNumberId(attributes.getValue(0));}tag=localName;}//元素结束@Overridepublic void endElement(String uri, String localName, String qName) throws SAXException {tag=null;if("student".equals(localName)){person.add(sb);}}//内容@Overridepublic void characters(char[] ch, int start, int length) throws SAXException {if(tag!=null){String data=new String(ch,start,length);if("name".equals(tag)){sb.setName(data);}else if("age".equals(tag)){sb.setAge(new Integer(data));}}}}}

//DomParserService.java类DOM解析

package sn.len.saxparser.service;import java.io.InputStream;import java.util.ArrayList;import java.util.List;import javax.xml.parsers.DocumentBuilder;import javax.xml.parsers.DocumentBuilderFactory;import org.w3c.dom.Document;import org.w3c.dom.Element;import org.w3c.dom.Node;import org.w3c.dom.NodeList;import sn.len.saxparser.domain.StudentBean;public class DomParserService {public List<StudentBean> getParse(InputStream inStream) throws Exception{List<StudentBean> listStudent=new ArrayList<StudentBean>();//获取Document工厂实例DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance();//通过工厂实例,建立Document对象DocumentBuilder builder=factory.newDocumentBuilder();//通过Document对象,开始解析xml文档(inStream文件)Document doc=builder.parse(inStream);//通过解析XML文件,得到文档元素Element el=doc.getDocumentElement();//重得到的文档元素中寻找标记为student的元素标签NodeList node=el.getElementsByTagName("student");//遍历student元素标签for(int i=0;i<node.getLength();i++){StudentBean sb=new StudentBean();//得到第i项student标签元素Element personElement=(Element)node.item(i);//得到第i项student标签元素的属性(id)sb.setNumberId(personElement.getAttribute("id"));//得到第i项student标签元素(student)的子元素节点NodeList personChilds=personElement.getChildNodes();//遍历for(int y=0;y<personChilds.getLength();y++){//判断当前节点是否是元素类型节点if(personChilds.item(y).getNodeType()==Node.ELEMENT_NODE){//通过student的子元素节点得到name元素标签Element childElement=(Element)personChilds.item(y);if("name".equals(childElement.getNodeName())){//设置name第一个子元素的值设置到bean中sb.setName(childElement.getFirstChild().getNodeValue());}if("age".equals(childElement.getNodeName())){sb.setAge(new Integer(childElement.getFirstChild().getNodeValue()));}}}listStudent.add(sb);//添加到集合}return listStudent;//返回集合}}
//PullParserService.java类PULL解析

package sn.len.saxparser.service;import java.io.IOException;import java.io.InputStream;import java.util.ArrayList;import java.util.List;import org.xmlpull.v1.XmlPullParser;import org.xmlpull.v1.XmlPullParserException;import sn.len.saxparser.domain.StudentBean;import android.util.Xml;public class PullParserService {public List<StudentBean> pullParser(InputStream inStream) throws XmlPullParserException, IOException{List<StudentBean> listBean=null;StudentBean sb=null;XmlPullParser pullParser=Xml.newPullParser();pullParser.setInput(inStream, "utf-8");int evenType=pullParser.getEventType();while(evenType!=XmlPullParser.END_DOCUMENT)//当事件类型不等于结束文档的时候就循环执行{switch (evenType){case XmlPullParser.START_DOCUMENT: //文档开始{listBean=new ArrayList<StudentBean>();}break;case XmlPullParser.START_TAG: //开始元素{String ElementName=pullParser.getName();if("student".equals(ElementName)){String attr=pullParser.getAttributeValue(0);sb=new StudentBean();sb.setNumberId(attr);}if("name".equals(ElementName)){String name=pullParser.nextText();sb.setName(name);}if("age".equals(ElementName)){String age=pullParser.nextText();sb.setAge(new Integer(age));}}break;case XmlPullParser.END_TAG://结束元素{String ElementName=pullParser.getName();if("student".equals(ElementName)){listBean.add(sb);sb=null;}}break;default:break;}evenType=pullParser.next();//移向下一个元素}return listBean;}}

四,写Junit类,前提是得配置。如果不会的可以看一下Junit配置文章

package sn.len.saxparser.service.test;import java.io.IOException;import java.io.InputStream;import java.util.List;import org.xmlpull.v1.XmlPullParserException;import sn.len.saxparser.domain.StudentBean;import sn.len.saxparser.service.DomParserService;import sn.len.saxparser.service.PullParserService;import sn.len.saxparser.service.SAXParserService;import android.test.AndroidTestCase;import android.util.Log;public class SAXAndDomAndPullParserServiceTest extends AndroidTestCase {private static final String SAXTAG="SAXParserContent";private static final String DOMTAG="DOMParserContent";private static final String PULLTAG="PULLParserContent";//SAX解析public void testSAXParser() throws Throwable{SAXParserService sax=new SAXParserService();InputStream inStream=getClass().getClassLoader().getResourceAsStream("Test.xml");List<StudentBean> stuBean=sax.getParsers(inStream);for(StudentBean stu:stuBean){Log.i(SAXTAG,stu.toString());}}//DOM解析public void testDOMParser() throws Exception{DomParserService dps=new DomParserService();InputStream inStream=getClass().getClassLoader().getResourceAsStream("Test.xml");List<StudentBean> listbean=dps.getParse(inStream);for(StudentBean stu:listbean){Log.i(DOMTAG, stu.toString());}}//PULL解析public void testPullParser() throws XmlPullParserException, IOException{InputStream inStream=getClass().getClassLoader().getResourceAsStream("Test.xml");PullParserService fps=new PullParserService();List<StudentBean> listBean=fps.pullParser(inStream);for(StudentBean stBean:listBean){Log.i(PULLTAG, stBean.toString());}}}

分别进行Junit测试结果

//SAX解析结果


//DOM解析结果

//PULL解析结果



原创粉丝点击