最近在做xml的解析工作,过去一直没有认真学习过xml,但是xml确实是一种很方便优秀的数据保存格式,对数据的描述非常清晰,我们是时候了解它的奥秘了。

xml是一种数据的保存格式,只关注数据的内容,不管数据的表现形式。它的跨平台性使很多软件都选择其为配置或软件数据的保存格式,而java这个跨平台的编程语言也对xml解析进行封装。

首先,jdk里面封装的xml解析方式包括dom和sax,对于dom方式,在html里面我们就已经了解得很多了,这里我不多说。而sax应该是我刚刚接触的xml特有的解析方式,他就像一个探地雷的工兵,在xml文档中探索,没经过一个元素开始、元素结束、处理指令开始、处理指令结束……都会向外报告,触发回调函数,废话不多说,直接上java代码:

1.

 //构建saxfactory和saxparser,利用factory可以把验证与解析xml分离,更好地实现低耦合SAXParserFactory saxParserFactory = SAXParserFactory.newInstance();SAXParser noteParser = saxParserFactory.newSAXParser();

2.调用saxparser对象的parse()方法解析xml文档,调用该方法时需要传入一个defaulthandler对象,defaulthandler这个类实现了contenthandler、dtdhandler、entityresolver和errorhandler4个接口,sax用该类进行了简化事件适配器和事件监听器的关系。

//构建defaultHandler监听xml事件,svghandler继承了defaulthandlerSVGhandler notehandler=new SVGhandler();//开始解析xmlnoteParser.parse(fis, notehandler);

3.然后再svghandler里面进行xml的解析,它重写了defaulthandler几个重要的方法。

(1)characters()中可以通过new String(ch,start,length)得到当前节点的文本数据,xml里所有节点的数据都是文本数据,

/*** 解析xml元素的文本数据*/@Overridepublic void characters(char[] ch, int start, int length)throws SAXException {// TODO Auto-generated method stubsuper.characters(ch, start, length);}

(2)startElement应该把它放在前面的,但是通常用它来获取节点的属性

/*** 开始解析xml元素属性* * @param qName*            元素名字通常与localName相同* @param attributes*            元素的属性数组*/@Overridepublic void startElement(String uri, String localName, String qName,Attributes attributes) throws SAXException {// 该结点属性的个数int len = attributes.getLength();currentTag = qName;if(currentTag.equals("mark")){note=new LineNotes();}if (len > 0) {// System.out.println("<" + currentTag + ">Ԫ�ص���������:" );for (int i = 0; i < len; i++) {if (attributes.getQName(i).equals("d"))// System.out.println(attributes.getQName(i) + "--->"// + attributes.getValue(i));{String path = attributes.getValue(i);// stringTokenizer����һ�ʵıʼ�StringTokenizer stringTokenizer = new StringTokenizer(path);}}}}

(3)endElement结束解析xml节点触发

@Overridepublic void endElement(String uri, String localName, String qName)throws SAXException {// TODO Auto-generated method stubsuper.endElement(uri, localName, qName);}

好吧,代码就说到这里,下面对dom和sax这两种方式比较一下:

  dom sax
速度 需要一次性装入整份xml文档,并将xml文档转换为dom树,因此速度较慢 顺序解析xml文档,无须一次装入xml文档,因此速度很快
重复访问 将xml文档转换为dom树以后,整个解析阶段dom树常驻内存,适合重复访问,效率很好 顺序解析xml文档,不保存已访问的数据,因此不适合重复访问
内存要求 内存占用率大 不保存已访问数据,内存占用少
修改 可以读取也可以修改节点内容 只能读取
优缺点 可以根据dom树重复访问,但速度慢,内存占用大 不能重复访问,但速度快,内存占用小

最后,我说一下,重复访问到底有什么用?举个反例吧,sax不支持重复访问,也就是说它只顾当前节点,无法得到上下文信息,不知道当前节点的父节点和子节点的任何信息,例如下面的xml代码,你只可能知道这是一本叫疯狂java讲义的书,还有price是50,但是你不知道疯狂java讲义是50块

<book name="疯狂java讲义">
<price>50</price>
</book>

一般的xml都是上下文相关的,所以尽管sax很快,但这个缺点对于它来说是一个很大的限制。

java解析xml技术(一)相关推荐

  1. java 解析xml技术

    最初,XML 语言仅仅是意图用来作为 HTML 语言的替代品而出现的,但是随着该语言的不断发展和完善,人们越来越发现它所具有的优点:例如标记语言可扩展,严格的语法规定,可使用有意义的标记,内容存储和表 ...

  2. 详解Java解析XML的四种方法

    http://developer.51cto.com  2009-03-31 13:12  cnlw1985  javaeye  我要评论(8) XML现在已经成为一种通用的数据交换格式,平台的无关性 ...

  3. xml教程之java解析xml文档

    1.java解析xml文件介绍 XML解析方式分为两种:DOM方式和SAX方式 DOM:Document Object Model,文档对象模型.这种方式是W3C推荐的处理XML的一种方式. SAX: ...

  4. Java解析XML汇总(DOM/SAX/JDOM/DOM4j/XPath)

    http://blog.csdn.net/smcwwh/article/details/7183869 关键字:Java解析xml.解析xml四种方法.DOM.SAX.JDOM.DOM4j.XPath ...

  5. java解析xml的几种方式

    java解析xml的几种方式 博客分类: java基础备忘-好记性不然烂笔头 XMLJava应用服务器数据结构编程  第一种:DOM. DOM的全称是Document Object Model,也即文 ...

  6. Java 解析 XML

    Java 解析 XML 标签: Java基础 XML解析技术有两种 DOM SAX DOM方式 根据XML的层级结构在内存中分配一个树形结构,把XML的标签,属性和文本等元素都封装成树的节点对象 优点 ...

  7. XML解析 (JAVA解析xml文件)java+Dom4j+Xpath xml文件解析根据子节点得到父节点 查找校验xml文件中相同的节点属性值 java遍历文件夹解析XML

    XML解析 (JAVA解析xml文件)java+Dom4j+Xpath xml文件解析根据子节点得到父节点 以及查找xml文件中相同的节点属性值 项目背景:这是本人实习中所碰到的项目,当时感觉很棘手, ...

  8. Java解析Xml的三种方式总结

    转自:http://blog.csdn.net/zjf280441589/article/details/50613881 XML解析技术有两种 DOM SAX DOM方式  根据XML的层级结构在内 ...

  9. Java解析XML字符串格式

    Java解析XML字符串格式 前言 代码示例 结果展示 前言 java解析XML字符串格式使用的是Dom4j这一种方式; dom4j是一个Java的XML API,是jdom的升级品,用来读写XML文 ...

最新文章

  1. Neutron 物理部署方案 - 每天5分钟玩转 OpenStack(68)
  2. 积分商城如何梳理思路和进行设计
  3. 在Centos 5.2下编译安装LAMP
  4. mysql重装远程服务未_CentOS 7系统安装与远程连接MySQL(5.7)
  5. deepin终端编译c程序_Deepin Linux安装使用Visual Studio Code(VSCode)调试C++
  6. R语言基础入门(3)之数据类型与相应运算1
  7. linux给目录加裸设备磁盘,Linux添加裸设备空间(Redhat)
  8. linux中的echo%3e文件,Linux学习笔记-shell脚本中${}的使用方法
  9. 理解 __doPostBack--2
  10. java删除文件目录及文件_Java删除文件,目录
  11. 布线工程-认识光纤和光缆
  12. WPS如何一页一页设置页眉
  13. Winter Vacation Training(5st Week)
  14. wamp5虚拟主机的配置
  15. 电脑快捷键快速关机方法,电脑如何快速关机
  16. 22考研杭师管理科学与工程专业368分经验贴(Python141+政治80+日语71,含数政专书籍与免费课程资源推荐)
  17. PYTHON对数值变量进行标准化,离散变量标签化
  18. html 透明的圆形,CSS3 花蝴蝶形状的3D透明圆球旋转变幻
  19. [转] 公共DNS,114.114.114.114和8.8.8.8
  20. Vue设置button的disable属性

热门文章

  1. 大数据项目实战教程:使用SparkSQL+Hbase+Oozie构建企业级用户画像
  2. 第一篇 数据结构、设计模式与手写代码
  3. 多交个朋友?罗永浩跳槽淘宝直播间;5分钟搞懂XGBoost算法;CUDA C++最佳实践指南;手写字体的倾斜校正;前沿论文 | ShowMeAI资讯日报
  4. Keil MDK5软件包的组成、Cortex微控制器软件接口标准CMSIS,重点介绍CMSIS-CORE的组成和使用
  5. Linux执行crontab计划任务,定时执行脚本或命令
  6. python颜色列表代码seaborn_Python seaborn.set_color_codes方法代码示例
  7. [多活] 分布式、多活数据中心如何实现DNS域名解析和负载均衡?
  8. Postman高级功能-Monitor
  9. [数仓笔记]数据建模
  10. 大咖实录|阿里巴巴集团首席技术官张建锋2017云栖大会演讲