<?xml version="1.0" encoding="UTF-8"?>
<root><student id="1" group="1"><name>小鹏</name><sex>男</sex><age>28</age><email>lvjian117@163.com</email><birthday>1984-03-03</birthday><memo>优良</memo></student><student id="2" group="2"><name>张思品</name><sex>女</sex><age>18</age><email>zhangshiping@163.com</email><birthday>1999-06-08</birthday><memo>好学生</memo></student><student id="3" group="3"><name>小王</name><sex>男</sex><age>18</age><email>xiaowang@163.com</email><birthday>1987-06-08</birthday><memo>好学生</memo></student><student id="4" group="4"><name>小张</name><sex>男</sex><age>18</age><email>xiaozhang@163.com</email><birthday>1987-06-08</birthday><memo>好学生</memo></student><student id="5" group="5"><name>小明</name><sex>男</sex><age>18</age><email>xiaoming@163.com</email><birthday>1987-06-08</birthday><memo>好学生</memo></student>
</root>

2,student.java

package cn.wzg.domain;public class Student {private int id;private int group;private String name;private String sex;private int age;private String email;private String memo;private String birthday;public int getId() {return id;}public void setId(int id) {this.id = id;}public int getGroup() {return group;}public void setGroup(int group) {this.group = group;}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getSex() {return sex;}public void setSex(String sex) {this.sex = sex;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}public String getEmail() {return email;}public void setEmail(String email) {this.email = email;}public String getMemo() {return memo;}public void setMemo(String memo) {this.memo = memo;}public String getBirthday() {return birthday;}public void setBirthday(String birthday) {this.birthday = birthday;}@Overridepublic String toString() {// TODO Auto-generated method stubreturn "my name is"+this.getName()+"  "+"my brithday is "+this.getBirthday();}}

一,SAX解析

SAX解析XML文档采用事件驱动模式。什么是事件驱动模式?它将XML文档转换成一系列的事件,由单独的事件处理器来决定如何处理。

基于事件驱动的处理模式主要是基于事件源和事件处理器(或者叫监听器)来工作的。一个可以产生事件的对象叫做事件源,而一个可以针对事件做出响应的对象就被叫做事件处理器。

(1)SaxParseXmlHandler

package cn.wzg.javabean;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 cn.wzg.domain.Student;public class SaxParseXmlHandler extends DefaultHandler {private List<Student> list;private Student student;private String tagname;public List<Student> getList() {return list;}public void setList(List<Student> list) {this.list = list;}public Student getStudent() {return student;}public void setStudent(Student student) {this.student = student;}public String getTagname() {return tagname;}public void setTagname(String tagname) {this.tagname = tagname;}@Overridepublic void startDocument() throws SAXException {list = new ArrayList<Student>();}@Overridepublic void endDocument() throws SAXException {}@Overridepublic void startElement(String uri, String localName, String qName,Attributes attributes) throws SAXException {if (qName.equals("student")) {student = new Student();student.setId(Integer.parseInt(attributes.getValue(0)));student.setGroup(Integer.parseInt(attributes.getValue(1)));}tagname = qName;}@Overridepublic void endElement(String uri, String localName, String qName)throws SAXException {if (qName.equals("student")) {list.add(student);}tagname = null;}@Overridepublic void characters(char[] ch, int start, int length)throws SAXException {if (tagname != null) {String data = new String(ch, start, length);if (tagname.equals("name")) {student.setName(data);} else if (tagname.equals("sex")) {student.setSex(data);} else if (tagname.equals("age")) {student.setAge(Integer.parseInt(data));} else if (tagname.equals("email")) {student.setEmail(data);} else if (tagname.equals("birthday")) {student.setBirthday(data);} else if (tagname.equals("memo")) {student.setBirthday(data);}}}}

(2)SaxParseXmlService.java

package cn.wzg.service;import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;import cn.wzg.domain.Student;
import cn.wzg.javabean.SaxParseXmlHandler;public class SaxParseXmlService {public static List<Student> getStudent(InputStream inputstrem) throws Throwable {List<Student> students = new ArrayList<Student>();//得到SAX哭器的工厂对象 ,让工厂对象去创建器对象SAXParser parser =SAXParserFactory.newInstance().newSAXParser();//创建DefaultHandler对象,SaxParseXmlHandler继承DefaultHandlerSaxParseXmlHandler handler= new SaxParseXmlHandler();parser.parse(inputstrem, handler);students=handler.getList();return students;}}

(3)TestStudentService.java

package cn.wzg.test;import java.io.InputStream;
import java.util.List;import cn.wzg.domain.Student;
import cn.wzg.service.DomPraseXmlService;
import cn.wzg.service.PullParseXmlService;
import cn.wzg.service.SaxParseXmlService;import android.test.AndroidTestCase;
import android.util.Log;//xml的三种解析问题
public class TestStudentService extends AndroidTestCase {private final static String DOMTAG = "TestStudentService";private final static String PULLTAG = "PullParseXmlService";private final static String SAXTAG = "SaxParseXmlService";public void testDomPraseService() throws Throwable {InputStream inStream = this.getClass().getClassLoader().getResourceAsStream("student.xml");List<Student> students = DomPraseXmlService.getStudent(inStream);for (Student student : students) {student.getName();Log.i(DOMTAG, student.toString());}}public void testPullParseXmlService() throws Throwable {InputStream inStream = this.getClass().getClassLoader().getResourceAsStream("student.xml");List<Student> students = PullParseXmlService.getStudent(inStream);for (Student student : students) {// student.getName();
            Log.i(PULLTAG, student.toString());}}public void testSaxParseXmlService() throws Throwable {InputStream inStream = this.getClass().getClassLoader().getResourceAsStream("student.xml");List<Student> students = SaxParseXmlService.getStudent(inStream);for (Student student : students) {// student.getName();
            Log.i(SAXTAG, student.toString());}}}

二,DOM解析xml

dom编程不要其它的依赖包,因为JDK里自带的JDK里含有的上面提到的org.w3c.dom、org.xml.sax
和javax.xml.parsers包就可以满意条件了。

(1)DomPraseXmlService.java

package cn.wzg.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 cn.wzg.domain.Student;/*** 采用dom解析xml文件内容* * @author cooperator* */public class DomPraseXmlService {public static List<Student> getStudent(InputStream inputstrem)throws Throwable {List<Student> students = new ArrayList<Student>();DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();DocumentBuilder db = factory.newDocumentBuilder();Document document = db.parse(inputstrem);Element element = document.getDocumentElement();NodeList studentNode = element.getElementsByTagName("student");for (int i = 0; i < studentNode.getLength(); i++) {Element studentElement = (Element) studentNode.item(i);Student student = new Student();student.setId(Integer.parseInt(studentElement.getAttribute("id")));student.setGroup(Integer.parseInt(studentElement.getAttribute("group")));NodeList studentChildNode = studentElement.getChildNodes();for (int j = 0; j < studentChildNode.getLength(); j++) {if (studentChildNode.item(j).getNodeType() == Node.ELEMENT_NODE) {Element childElement = (Element) studentChildNode.item(j);if ("name".equals(childElement.getNodeName())) {student.setName(childElement.getFirstChild().getNodeValue());} else if ("age".equals(childElement.getNodeName())) {student.setAge(Integer.parseInt(childElement.getFirstChild().getNodeValue()));} else if ("sex".equals(childElement.getNodeName())) {student.setSex(childElement.getFirstChild().getNodeValue());} else if ("email".equals(childElement.getNodeName())) {student.setEmail(childElement.getFirstChild().getNodeValue());} else if ("memo".equals(childElement.getNodeName())) {student.setMemo(childElement.getFirstChild().getNodeValue());} else if ("birthday".equals(childElement.getNodeName())) {student.setBirthday(childElement.getFirstChild().getNodeValue());}}}students.add(student);}return students;}}

(2)测试类和上面的一样TestStudentService.java

package cn.wzg.test;import java.io.InputStream;
import java.util.List;import cn.wzg.domain.Student;
import cn.wzg.service.DomPraseXmlService;
import cn.wzg.service.PullParseXmlService;
import cn.wzg.service.SaxParseXmlService;import android.test.AndroidTestCase;
import android.util.Log;//xml的三种解析问题
public class TestStudentService extends AndroidTestCase {private final static String DOMTAG = "TestStudentService";private final static String PULLTAG = "PullParseXmlService";private final static String SAXTAG = "SaxParseXmlService";public void testDomPraseService() throws Throwable {InputStream inStream = this.getClass().getClassLoader().getResourceAsStream("student.xml");List<Student> students = DomPraseXmlService.getStudent(inStream);for (Student student : students) {student.getName();Log.i(DOMTAG, student.toString());}}public void testPullParseXmlService() throws Throwable {InputStream inStream = this.getClass().getClassLoader().getResourceAsStream("student.xml");List<Student> students = PullParseXmlService.getStudent(inStream);for (Student student : students) {// student.getName();
            Log.i(PULLTAG, student.toString());}}public void testSaxParseXmlService() throws Throwable {InputStream inStream = this.getClass().getClassLoader().getResourceAsStream("student.xml");List<Student> students = SaxParseXmlService.getStudent(inStream);for (Student student : students) {// student.getName();
            Log.i(SAXTAG, student.toString());}}}

三,PULL解析XML
  PullParseXmlService.java

package cn.wzg.service;import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;import org.xmlpull.v1.XmlPullParser;import android.util.Xml;import cn.wzg.domain.Student;public class PullParseXmlService {public static List<Student> getStudent(InputStream inputStream)throws Throwable {List<Student> students = null;Student student = null;XmlPullParser parser = Xml.newPullParser();parser.setInput(inputStream, "Utf-8");int event = parser.getEventType();while (event != XmlPullParser.END_DOCUMENT) {switch (event) {case XmlPullParser.START_DOCUMENT:students = new ArrayList<Student>();break;case XmlPullParser.START_TAG:if ("student".equals(parser.getName())) {student = new Student();student.setId(Integer.parseInt(parser.getAttributeValue(0)));student.setGroup(Integer.parseInt(parser.getAttributeValue(1)));}if (student != null) {if ("name".equals(parser.getName())) {student.setName(parser.nextText());} else if ("sex".equals(parser.getName())) {student.setSex(parser.nextText());} else if ("age".equals(parser.getName())) {student.setAge(Integer.parseInt(parser.nextText()));} else if ("email".equals(parser.getName())) {student.setEmail(parser.nextText());} else if ("birthday".equals(parser.getName())) {student.setBirthday(parser.nextText());} else if ("memo".equals(parser.getName())) {student.setMemo(parser.nextText());}}break;case XmlPullParser.END_TAG:if ("student".equals(parser.getName())) {students.add(student);student = null;}break;}event = parser.next();}return students;}
}

(2)测试类

package cn.wzg.test;import java.io.InputStream;
import java.util.List;import cn.wzg.domain.Student;
import cn.wzg.service.DomPraseXmlService;
import cn.wzg.service.PullParseXmlService;
import cn.wzg.service.SaxParseXmlService;import android.test.AndroidTestCase;
import android.util.Log;//xml的三种解析问题
public class TestStudentService extends AndroidTestCase {private final static String DOMTAG = "TestStudentService";private final static String PULLTAG = "PullParseXmlService";private final static String SAXTAG = "SaxParseXmlService";public void testDomPraseService() throws Throwable {InputStream inStream = this.getClass().getClassLoader().getResourceAsStream("student.xml");List<Student> students = DomPraseXmlService.getStudent(inStream);for (Student student : students) {student.getName();Log.i(DOMTAG, student.toString());}}public void testPullParseXmlService() throws Throwable {InputStream inStream = this.getClass().getClassLoader().getResourceAsStream("student.xml");List<Student> students = PullParseXmlService.getStudent(inStream);for (Student student : students) {// student.getName();
            Log.i(PULLTAG, student.toString());}}public void testSaxParseXmlService() throws Throwable {InputStream inStream = this.getClass().getClassLoader().getResourceAsStream("student.xml");List<Student> students = SaxParseXmlService.getStudent(inStream);for (Student student : students) {// student.getName();
            Log.i(SAXTAG, student.toString());}}}

转载于:https://www.cnblogs.com/lvjian117/archive/2012/05/01/2478170.html

xml文件的三种解析方式 DOM SAM PULL相关推荐

  1. xml的三种解析方式

    本篇博客重点介绍Android中三种解析XML的方式,包括PULL.SAX.DOM,当然不止这些,还可以用第三方的jar包提供的解析,只是这三种在Android中比较常用吧.再顺便介绍一下Androi ...

  2. JSON的三种解析方式以及JSONObject、JSONArray区别

    JSON的常用两种解析方式 一.什么是JSON? JSON是一种取代XML的数据结构,和xml相比,它更小巧但描述能力却不差,由于它的小巧所以网络传输数据将减少更多流量从而加快速度. JSON就是一串 ...

  3. Python对文件的三种打开方式以及with管理上下文

    文件的三种打开方式以及with管理上下文 一.文件的三种打开方式 1.1 只读 f = open(r'D:\pycharm\python\123.txt','r',encoding='utf8') d ...

  4. HTML读取xml文件的三种办法

    刚开始学这里的时候有点懵,以前没学过.但是学安卓动画(Animation)的时候接触过xml文件,总体来说不难. 一般来说xml文件用来储存数据,然后html读取它,主要介绍三种读取方式 利用CSS读 ...

  5. 使用Trados翻译XML文件的三种方法

    XML是The Extensible Markup Language(可扩展标识语言)的缩写,是国际组织W3C于2000年10月6日发布的文件标准格式,目前版本是XML1.0版本,因此,现在越来越多的 ...

  6. XML常用的几种解析方式

    XML的解析方式有很多,光开源的就有十多种:如Xerces.JDOM.DOM4J.XOM.JiBX.KXML.XMLBeans.jConfig.XStream.XJR等. 更多免费教学文章请关注这里 ...

  7. XML常见的两种解析方式总结

    XML解析方式 在程序开发过程中,经常需要对XML文档进行解析,常见套路往往是:XML文档–>XML解析器<–>API<–>应用程序.经常用到的解析方式如下: - DOM ...

  8. CSS文件的三种引入方式

    CSS的引入方式共有三种:行内样式.内部样式表.外部样式表. 一.行内样式 使用style属性引入CSS样式. 示例: <h1 style="color:red;">s ...

  9. Python文件的三种打开方式

    1.r只读模式 f = open('text.txt','r',encoding = 'utf8') # 用的是相对路径 data = f.read() print(f.readable())# 判断 ...

最新文章

  1. 我看过的数据库方面的好文章
  2. 中医治疗慢性病很有效
  3. Qt--qss(暗橙色)
  4. 20220203--CTF刷题WEB方向-- PHP2--考察URL编码解码和修改php后缀为phps
  5. 树莓派4B (aarch64) 安装PyTorch 1.8 的可行方案
  6. java socket通讯_Java socket通讯实现过程及问题解决
  7. 【Flink】Flink 如何 保证 同一个key对应的state是一个呢?KeyedProcessFunction
  8. 图灵完备-转自 知乎 陈超 的回答
  9. Windows Server 2012 克隆修改SID
  10. python交互式程序设计导论第三周小测验答案,2020学堂云Python 交互式程序设计导论答案第五章节答案...
  11. 【滤波器】基于matlab脉冲响应不变法+双线性变换法数字滤波器设计【含Matlab源码 884期】
  12. 多路召回 -- 融合策略
  13. 【优化模型】报童的诀窍
  14. 音乐Npc弹窗 c#
  15. java gps809_车载GPS对接809协议的数据对接
  16. OA系统、ERP系统、MIS系统的区别
  17. 创业十年的感悟,创业者首先要让自己活下去
  18. pip install 安装报错:ValueError: check_hostname requires server_hostname
  19. jQuery+nicescroll滚动条实现视频点播页面
  20. 人类学家胡家奇谈科技发展:让它回归理性

热门文章

  1. 又到年关,年终奖你能拿多少?
  2. 数据交换-电路/报文/分组交换
  3. Git的下载与安装(详细)
  4. Spring IOC容器的依赖注入流程(收集和注册、分析和组装)
  5. 批量执行定时任务_执行批量维护任务安全策略
  6. ssas表格模型 权限控制_如何在SQL Server 2016中自动执行SSAS表格模型处理
  7. baseline_如何安装和使用Microsoft Baseline Security Analyzer(MBSA)
  8. ssis组件_使用SSIS Hadoop组件连接到Apache Hive和Apache Pig
  9. ssas如何创建分区_Analysis Services(SSAS)多维设计技巧–创建尺寸
  10. vue-cli配置移动端自适应