深入浅出如何解析xml文件---下篇
在上篇博文中,小编主要介绍xml的两种解析方式,分别是dom4j和dom,今天这篇博文,小编主要来简单介绍一下xml的其她两种解析方式sax和jdom。
sax解析xml文件
sax,全称是Simple API for XML ,即是一种接口,也是一种软件包,她也是一种xml解析的替代方法,sax不同于dom解析,她逐行扫描文档,一边扫描一边解析,由于应用程序只是在读取数据时检查数据,因为不需要将数据存储在内存中,这对于大型文档的解析是个巨大优势。
sax这种处理的优点非常类似于流媒体的优点。分析能够立即开始,而不是等待所有的数据被处理。而且,由于应用程序只是在读取数据时检查数据,因此不需要将数据存储在内存中。这对于大型文档来说是个巨大的优点。事实上,应用程序甚至不必解析整个文档;它可以在某个条件得到满足时停止解析。一般来说,SAX 还比它的替代者 DOM 快许多。如下deom所示:
<?xml version="1.0" encoding="UTF-8"?> <root> <student id="1" group="1"> <name>张三</name> <sex>男</sex> <age>18</age> <email>zhangsan@163.com</email> <birthday>1987-06-08</birthday> <memo>好学生</memo> </student> <student id="2" group="2"> <name>李四</name> <sex>女</sex> <age>18</age> <email>lisi@163.com</email> <birthday>1987-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>
使用sax解析如下所示:
import java.util.ArrayList; import java.util.List; import org.xml.sax.Attributes; import org.xml.sax.SAXException; import org.xml.sax.helpers.DefaultHandler; /** * 功能描述:采用sax方式解析XML<br> * * @author 丁国华 * */ public class SaxParseXml extends DefaultHandler{ //存放遍历集合 private List<Student> list; //构建Student对象 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; } //只调用一次 初始化list集合 @Override public void startDocument() throws SAXException { list=new ArrayList<Student>(); } //调用多次 开始解析 @Override public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { if(qName.equals("student")){ student=new Student(); //获取student节点上的id属性值 student.setId(Integer.parseInt(attributes.getValue(0))); //获取student节点上的group属性值 student.setGroup(Integer.parseInt(attributes.getValue(1))); } this.tagName=qName; } //调用多次 @Override public void endElement(String uri, String localName, String qName) throws SAXException { if(qName.equals("student")){ this.list.add(this.student); } this.tagName=null; } //只调用一次 @Override public void endDocument() throws SAXException { } //调用多次 @Override public void characters(char[] ch, int start, int length) throws SAXException { if(this.tagName!=null){ String date=new String(ch,start,length); if(this.tagName.equals("name")){ this.student.setName(date); } else if(this.tagName.equals("sex")){ this.student.setSex(date); } else if(this.tagName.equals("age")){ this.student.setAge(Integer.parseInt(date)); } else if(this.tagName.equals("email")){ this.student.setEmail(date); } else if(this.tagName.equals("birthday")){ this.student.setBirthday(date); } else if(this.tagName.equals("memo")){ this.student.setMemo(date); } } } }
使用sax解析xml文件,有哪些优点和缺点呢?如下所示:
优点:
a、不需要等待所有数据都被处理,分析就能立即开始;
b、只在读取数据时检查数据,不需要保存在内存中;
c、可以在某个条件得到满足时停止解析,不必解析整个文档;
d、效率和性能较高,能解析大于系统内存的文档。
缺点:
a、需要应用程序自己负责TAG的处理逻辑,使用起来比较麻烦;
b、单向导航,很难同时访问同一文档的不同部分数据,不支持XPath。
jdom解析xml文件
接着,来介绍jdom解析xml的方式,jdom是一种使用xml的独特java工具包,她的设计包含java语言的语法乃至语言。 jdom的目的是成为 java特定文档模型,它简化与xml的交互并且比使用 dom实现更快。由于是第一个 java特定模型,jdom一直得到大力推广和促进。正在考虑通过“java 规范请求 JSR-102”将它最终用作“Java 标准扩展”。从 2000 年初就已经开始了 jdom开发。
jdom 与 dom 主要有两方面不同。首先,jdom仅使用具体类而不使用接口。这在某些方面简化了 API,但是也限制了灵活性。第二,API 大量使用了 Collections 类,简化了那些已经熟悉这些类的 Java 开发者的使用。
jdom文档声明其目的是“使用 20%(或更少)的精力解决 80%(或更多)Java/XML 问题”(根据学习曲线假定为 20%)。jdom 对于大多数 Java/XML 应用程序来说当然是有用的,并且大多数开发者发现 API 比dom 容易理解得多。jdom 还包括对程序行为的相当广泛检查以防止用户做任何在 XML 中无意义的事。然而,它仍需要您充分理解 xml以便做一些超出基本的工作(或者甚至理解某些情况下的错误)。这也许是比学习 dom 或 jdom 接口都更有意义的工作。
jdom自身不包含解析器。它通常使用 SAX2 解析器来解析和验证输入 XML 文档(尽管它还可以将以前构造的 dom表示作为输入)。它包含一些转换器以将 jdom表示输出成 SAX2 事件流、dom模型或 xml 文本文档。jdom 是在 Apache 许可证变体下发布的开放源码。看下面一个dome,xml文件如下所示:
<?xml version="1.0" encoding="UTF-8"?> <prop> <mess> <property name="sSize" value="52"></property> <property name="cSize" value="23"></property> <property name="pSize" value="15"></property> <property name="aSize" value="25"></property> </mess> </prop>
使用jdom解析如下所示:
package com.fancy.util; import java.util.List; import org.jdom.Document; import org.jdom.Element; import org.jdom.input.SAXBuilder; public class XmlDom { public static String obtainValue(String name){ try { //创建一个SAXBuilder对象 SAXBuilder saxBuilder = new SAXBuilder(); //读取prop.xml资源 Document doc = saxBuilder.build("prop.xml"); //获取根元素(prop) Element root = doc.getRootElement(); //获取根元素下面的所有子元素(mess) List<Element> messList = root.getChildren("mess"); //子根元素(mess) Element childrenRoot = null; //property元素集合 List<Element> propertyList = null; //遍历根元素的子元素集合(即遍历mess元素) for(int i = 0; i < messList.size(); i++){ //将根元素prop下的mess子元素作为一个新的子根元素 childrenRoot = messList.get(i); //获取子根元素mess下的所有property子元素 propertyList = childrenRoot.getChildren("property"); //遍历子根元素的子元素集合(即遍历property元素) for(int j = 0; j < propertyList.size(); j++){ //获取property元素 Element element = propertyList.get(j); //element.getAttributeValue("name"):获取property中name属性的值 if(element.getAttributeValue("name").equals(name)){ //如果name的值一致 return element.getAttributeValue("value"); //取得name对应的value属性值 } } } //遍历完没有查找到结果返回null return null; } catch (Exception e) {e.printStackTrace();} return null; } } 复制代码
使用jdom解析xml文件的方式,具有以下优缺点:
优点:
a、使用具体类而不是接口,简化了dom的api;
b、大量使用java集合类,方便了java开发人员。
缺点:
a、没有较好的灵活性;
b、性能较差。
小编寄语:博文介绍到这里,小编已经把四种解析xml文件的方式介绍完了, JDOM 和 DOM 在性能测试时表现不佳,在测试 10M 文档时内存溢出。在小文档情况下还值得考虑使用 DOM 和 JDOM。虽然 JDOM 的开发者已经说明他们期望在正式发行版前专注性能问题,但是从性能观点来看,它确实没有值得推荐之处。另外,DOM 仍是一个非常好的选择。DOM 实现广泛应用于多种编程语言。它还是许多其它与 XML 相关的标准的基础,因为它正式获得 W3C 推荐(与基于非标准的 Java 模型相对),所以在某些类型的项目中可能也需要它(如在 javascript 中使用 DOM)。
SAX表现较好,这要依赖于它特定的解析方式。一个 SAX 检测即将到来的XML流,但并没有载入到内存(当然当XML流被读入时,会有部分文档暂时隐藏在内存中)。
无疑,DOM4J是最好的,目前许多开源项目中大量采用 DOM4J,例如大名鼎鼎的 Hibernate 也用 DOM4J 来读取 XML 配置文件。如果不考虑可移植性,可以采用dom4j,java之路,未完待续。
深入浅出如何解析xml文件---下篇的更多相关文章
- 深入浅出如何解析xml文件---上篇
xml小伙伴们并不陌生,xml是可扩展标记语言,标准通用标记语言语言的子集,是一种用来标记电子文件使其具有结构性的标记语言.我们知道xml可以用dom与sax等方法进行解析,但是xml为什么要解析呢? ...
- Android 解析XML文件和生成XML文件
解析XML文件 public static void initXML(Context context) { //can't create in /data/media/0 because permis ...
- JAVA使用SAX解析XML文件
在我的另一篇文章(http://www.cnblogs.com/anivia/p/5849712.html)中,通过一个例子介绍了使用DOM来解析XML文件,那么本篇文章通过相同的XML文件介绍如何使 ...
- JAVA中使用DOM解析XML文件
XML是一种方便快捷高效的数据保存传输的格式,在JSON广泛使用之前,XML是服务器和客户端之间数据传输的主要方式.因此,需要使用各种方式,解析服务器传送过来的信息,以供使用者查看. JAVA作为一种 ...
- java中采用dom4j解析xml文件
一.前言 在最近的开发中用到了dom4j来解析xml文件,以前听说过来解析xml文件的几种标准方式:但是从来的没有应用过来,所以可以在google中搜索dmo4j解析xml文件的方式,学习一下dom4 ...
- XML:使用DOM技术解析xML文件中的城市,实现select级联选择
中国的城市xml格式:cities.xml <?xml version="1.0" encoding="utf-8"?> <china> ...
- dom4j如何解析XML文件
最近在 一些对xml文件的操作,下面简单写一个dom4j解析xml文件并将其封装到一个javabean中的例子,只是具有针对性的,不是通用的,仅供参考哦~~ 首先说:dom4j是一个java的XML ...
- java解析XML文件
dom4j是一个Java的XML API,类似于jdom,用来读写XML文件的.dom4j是一个非常非常优秀的Java XML API,具有性能优异.功能强大和极端易用使用的特点,同时它也是一个开放源 ...
- Android开发学习---使用XmlPullParser解析xml文件
Android中解析XML的方式主要有三种:sax,dom和pull关于其内容可参考:http://blog.csdn.net/liuhe688/article/details/6415593 本文将 ...
随机推荐
- [LeetCode] Kill Process 结束进程
Given n processes, each process has a unique PID (process id) and its PPID (parent process id). Each ...
- 使用redis,zookeeper实现分布式锁
1.分布式锁 分布式锁一般用在分布式系统或者多个应用中,用来控制同一任务是否执行或者任务的执行顺序.在项目中,部署了多个tomcat应用,在执行定时任务时就会遇到同一任务可能执行多次的情况,我们可以借 ...
- JavaScript根据经纬度获取距离信息
最近开发微信小程序,遇到了外卖配送半径的问题,在网上查阅了诸多资料,也大概理解了经纬度距离计算的公式原理,在此做下笔记,方便自己和大家学习使用. 若是把地球当作一个正常的球体(其实它是椭球)来说,球面 ...
- [JSOI2008]Blue Mary开公司
Description Input 第一行 :一个整数N ,表示方案和询问的总数. 接下来N行,每行开头一个单词“Query”或“Project”. 若单词为Query,则后接一个整数T,表示Bl ...
- APIO 2015
老师让我们打这套题练练手.感觉这套题还是挺有意思的,比国内某些比赛不知道高到哪里去.最后我拿了284/300,貌似比赛是IOI赛制啊,强行被当成OI赛制做了,不然我T3可能还能多骗点. T1.scul ...
- FJOI2017 RP++
嗯如果算得没错大概十二小时之后就是省选二试了 这次考试貌似就在我们学校 虽然机子挺旧的基本没用过 平时训练都是在专门的机房 其实貌似压力不是很大 因为一试跪了TAT 那时候还是图样 T3按照惯例是 ...
- java的泛型
泛型概述 先看下面的代码: ArrayList al1 = new ArrayList(); ArrayList al2 = new ArrayList(); al1.add("hello& ...
- SVN与Git
一:SVN是什么?SVN是Subversion的简称,是一个开放源代码的版本控制系统,相较于RCS.CVS,它采用了分支管理系统,它的设计目标就是取代CVS.互联网上很多版本控制服务已从CVS迁移到S ...
- DCOM EXCE权限配置问题
检索COM 类工厂中 CLSID 为 {00024500-0000-0000-C000-000000000046}的组件时失败,原因是出现以下错误: 80070005: 关于以上这个问题,博主在百度上 ...
- Linux学习之CentOS(十二)----磁盘管理之 认识ext文件系统(转)
认识ext文件系统 硬盘组成与分割 文件系统特性 Linux 的 EXT2 文件系统(inode) 与目录树的关系 EXT2/EXT3 文件的存取与日志式文件系统的功能 Linux 文件系统的运行 挂 ...