xml文件的三种解析方式 DOM SAM PULL
<?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相关推荐
- xml的三种解析方式
本篇博客重点介绍Android中三种解析XML的方式,包括PULL.SAX.DOM,当然不止这些,还可以用第三方的jar包提供的解析,只是这三种在Android中比较常用吧.再顺便介绍一下Androi ...
- JSON的三种解析方式以及JSONObject、JSONArray区别
JSON的常用两种解析方式 一.什么是JSON? JSON是一种取代XML的数据结构,和xml相比,它更小巧但描述能力却不差,由于它的小巧所以网络传输数据将减少更多流量从而加快速度. JSON就是一串 ...
- Python对文件的三种打开方式以及with管理上下文
文件的三种打开方式以及with管理上下文 一.文件的三种打开方式 1.1 只读 f = open(r'D:\pycharm\python\123.txt','r',encoding='utf8') d ...
- HTML读取xml文件的三种办法
刚开始学这里的时候有点懵,以前没学过.但是学安卓动画(Animation)的时候接触过xml文件,总体来说不难. 一般来说xml文件用来储存数据,然后html读取它,主要介绍三种读取方式 利用CSS读 ...
- 使用Trados翻译XML文件的三种方法
XML是The Extensible Markup Language(可扩展标识语言)的缩写,是国际组织W3C于2000年10月6日发布的文件标准格式,目前版本是XML1.0版本,因此,现在越来越多的 ...
- XML常用的几种解析方式
XML的解析方式有很多,光开源的就有十多种:如Xerces.JDOM.DOM4J.XOM.JiBX.KXML.XMLBeans.jConfig.XStream.XJR等. 更多免费教学文章请关注这里 ...
- XML常见的两种解析方式总结
XML解析方式 在程序开发过程中,经常需要对XML文档进行解析,常见套路往往是:XML文档–>XML解析器<–>API<–>应用程序.经常用到的解析方式如下: - DOM ...
- CSS文件的三种引入方式
CSS的引入方式共有三种:行内样式.内部样式表.外部样式表. 一.行内样式 使用style属性引入CSS样式. 示例: <h1 style="color:red;">s ...
- Python文件的三种打开方式
1.r只读模式 f = open('text.txt','r',encoding = 'utf8') # 用的是相对路径 data = f.read() print(f.readable())# 判断 ...
最新文章
- 我看过的数据库方面的好文章
- 中医治疗慢性病很有效
- Qt--qss(暗橙色)
- 20220203--CTF刷题WEB方向-- PHP2--考察URL编码解码和修改php后缀为phps
- 树莓派4B (aarch64) 安装PyTorch 1.8 的可行方案
- java socket通讯_Java socket通讯实现过程及问题解决
- 【Flink】Flink 如何 保证 同一个key对应的state是一个呢?KeyedProcessFunction
- 图灵完备-转自 知乎 陈超 的回答
- Windows Server 2012 克隆修改SID
- python交互式程序设计导论第三周小测验答案,2020学堂云Python 交互式程序设计导论答案第五章节答案...
- 【滤波器】基于matlab脉冲响应不变法+双线性变换法数字滤波器设计【含Matlab源码 884期】
- 多路召回 -- 融合策略
- 【优化模型】报童的诀窍
- 音乐Npc弹窗 c#
- java gps809_车载GPS对接809协议的数据对接
- OA系统、ERP系统、MIS系统的区别
- 创业十年的感悟,创业者首先要让自己活下去
- pip install 安装报错:ValueError: check_hostname requires server_hostname
- jQuery+nicescroll滚动条实现视频点播页面
- 人类学家胡家奇谈科技发展:让它回归理性
热门文章
- 又到年关,年终奖你能拿多少?
- 数据交换-电路/报文/分组交换
- Git的下载与安装(详细)
- Spring IOC容器的依赖注入流程(收集和注册、分析和组装)
- 批量执行定时任务_执行批量维护任务安全策略
- ssas表格模型 权限控制_如何在SQL Server 2016中自动执行SSAS表格模型处理
- baseline_如何安装和使用Microsoft Baseline Security Analyzer(MBSA)
- ssis组件_使用SSIS Hadoop组件连接到Apache Hive和Apache Pig
- ssas如何创建分区_Analysis Services(SSAS)多维设计技巧–创建尺寸
- vue-cli配置移动端自适应