java解析xml技术(一)
最近在做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技术(一)相关推荐
- java 解析xml技术
最初,XML 语言仅仅是意图用来作为 HTML 语言的替代品而出现的,但是随着该语言的不断发展和完善,人们越来越发现它所具有的优点:例如标记语言可扩展,严格的语法规定,可使用有意义的标记,内容存储和表 ...
- 详解Java解析XML的四种方法
http://developer.51cto.com 2009-03-31 13:12 cnlw1985 javaeye 我要评论(8) XML现在已经成为一种通用的数据交换格式,平台的无关性 ...
- xml教程之java解析xml文档
1.java解析xml文件介绍 XML解析方式分为两种:DOM方式和SAX方式 DOM:Document Object Model,文档对象模型.这种方式是W3C推荐的处理XML的一种方式. SAX: ...
- Java解析XML汇总(DOM/SAX/JDOM/DOM4j/XPath)
http://blog.csdn.net/smcwwh/article/details/7183869 关键字:Java解析xml.解析xml四种方法.DOM.SAX.JDOM.DOM4j.XPath ...
- java解析xml的几种方式
java解析xml的几种方式 博客分类: java基础备忘-好记性不然烂笔头 XMLJava应用服务器数据结构编程 第一种:DOM. DOM的全称是Document Object Model,也即文 ...
- Java 解析 XML
Java 解析 XML 标签: Java基础 XML解析技术有两种 DOM SAX DOM方式 根据XML的层级结构在内存中分配一个树形结构,把XML的标签,属性和文本等元素都封装成树的节点对象 优点 ...
- XML解析 (JAVA解析xml文件)java+Dom4j+Xpath xml文件解析根据子节点得到父节点 查找校验xml文件中相同的节点属性值 java遍历文件夹解析XML
XML解析 (JAVA解析xml文件)java+Dom4j+Xpath xml文件解析根据子节点得到父节点 以及查找xml文件中相同的节点属性值 项目背景:这是本人实习中所碰到的项目,当时感觉很棘手, ...
- Java解析Xml的三种方式总结
转自:http://blog.csdn.net/zjf280441589/article/details/50613881 XML解析技术有两种 DOM SAX DOM方式 根据XML的层级结构在内 ...
- Java解析XML字符串格式
Java解析XML字符串格式 前言 代码示例 结果展示 前言 java解析XML字符串格式使用的是Dom4j这一种方式; dom4j是一个Java的XML API,是jdom的升级品,用来读写XML文 ...
最新文章
- Neutron 物理部署方案 - 每天5分钟玩转 OpenStack(68)
- 积分商城如何梳理思路和进行设计
- 在Centos 5.2下编译安装LAMP
- mysql重装远程服务未_CentOS 7系统安装与远程连接MySQL(5.7)
- deepin终端编译c程序_Deepin Linux安装使用Visual Studio Code(VSCode)调试C++
- R语言基础入门(3)之数据类型与相应运算1
- linux给目录加裸设备磁盘,Linux添加裸设备空间(Redhat)
- linux中的echo%3e文件,Linux学习笔记-shell脚本中${}的使用方法
- 理解 __doPostBack--2
- java删除文件目录及文件_Java删除文件,目录
- 布线工程-认识光纤和光缆
- WPS如何一页一页设置页眉
- Winter Vacation Training(5st Week)
- wamp5虚拟主机的配置
- 电脑快捷键快速关机方法,电脑如何快速关机
- 22考研杭师管理科学与工程专业368分经验贴(Python141+政治80+日语71,含数政专书籍与免费课程资源推荐)
- PYTHON对数值变量进行标准化,离散变量标签化
- html 透明的圆形,CSS3 花蝴蝶形状的3D透明圆球旋转变幻
- [转] 公共DNS,114.114.114.114和8.8.8.8
- Vue设置button的disable属性
热门文章
- 大数据项目实战教程:使用SparkSQL+Hbase+Oozie构建企业级用户画像
- 第一篇 数据结构、设计模式与手写代码
- 多交个朋友?罗永浩跳槽淘宝直播间;5分钟搞懂XGBoost算法;CUDA C++最佳实践指南;手写字体的倾斜校正;前沿论文 | ShowMeAI资讯日报
- Keil MDK5软件包的组成、Cortex微控制器软件接口标准CMSIS,重点介绍CMSIS-CORE的组成和使用
- Linux执行crontab计划任务,定时执行脚本或命令
- python颜色列表代码seaborn_Python seaborn.set_color_codes方法代码示例
- [多活] 分布式、多活数据中心如何实现DNS域名解析和负载均衡?
- Postman高级功能-Monitor
- [数仓笔记]数据建模
- 大咖实录|阿里巴巴集团首席技术官张建锋2017云栖大会演讲