java 解析3层xml_java xml 解析方式汇总#高级程序员必备技能#
1。xml背景
格式良好的(web-fromed)xml可以不需要文档类型定义(DTD),只要满足基本的xml格式规范就可以认为是格式良好的xml文档。但是格式标准,只能说明元素、标签、格式是合法的,并不能说明元素是有意义的,或者说规范的。
有效的xml文档,首先要求是格式良好的文档,同时遵守相应的DTD文件约束。
2。xml解析
xml文档解析的大致使用过程如下图:
由xml解析器解析和操作指定的xml文档,然后提供接口供应用程序使用。如果解析器不同,那么提供的接口就有可能不同。庆幸的是,目前所有的xml解析器对两套标准的api提供了支持,这两套标准api就是dom和sax。
dom:即document object model,文档对象模型,它是w3c组织推荐的处理xml的标准接口。dom是基于xml文档结构树的解析。
sax:即simple api for xml,它是非官方的、xml社区事实上的标准。sax是基于事件流的解析。
dom和sax只是定义了一些接口以及某些接口的缺省实现,应用程序要想利用dom或sax访问xml文档,还需要真正实现dom或sax接口的xml解析器。apache的xerces是一个使用非常广泛的解析器,它实现了dom和sax的调用接口,并提供了多种语言的实现版本。
3。java语言对xml文档的解析
首先介绍jaxp:
基于dom或sax提供的api接口,使用相应的解析器实现类我们已经可以对xml进行解析处理了。如下所示:
org.xml.sax.XMLReader sp=neworg.apache.xerces.parser.SAXParser();
FileInputStream fis=newFileInputStream("hello.xml");
InputSource is=newInputSource(fis);
sp.setContentHandler(newMyConentHandler());
sp.parse(is);
为了屏蔽xml解析器的变化对代码的影响,java提供了一套标准的处理xml文件的接口(实际上是一些抽象的工厂类),使得java开发人员以一种标准的方式对xml进行编程,即jaxp(java api for xml processing)。jaxp没有提供解析xml的新方法,只是在解析器之上封装一个抽象层。在jdk1.6的文档中,我们可以看到javax.xml,org.w3c.dom,org.xml.sax包及其子包都属于jaxp的部分。jaxp由接口、抽象类和一些辅助类组成,符合jaxp规范的解析器实现其中的接口和抽象类,开发时只需要使用jaxp的api编程,底层的解析器对开发者时透明的,可以随意的切换。
那么jaxp出现后,java应用程序处理xml文档的过程就如下图:
那实际采用哪种解析器的jaxp实现,可以通过系统属性、properties文件等方式来配置。
下面具体介绍几种java解析xml的方法:
3.1 DOM方式(jaxp)
在javax.xml.parsers包中,定义了dom的抽象工厂类DocumentBuilderFactory,在这个类中有一个静态的方法newInstance(),通过它产生一个DocumentBuilderFactory的实例。前面提到过jaxp编程,解析器提供商必须继承该抽象类产生一个具体的解析器工厂,然后由这个工厂类实例出一个解析器对象,再通过该解析器对象处理xml文档。那么这个newInstance方法就是用来产生一个具体的解析器工厂类实例,查找生成解析器工厂类实例的方式可参考jdk文档。
在获取到解析器工厂类实例类之后,就可以调用newDocumentBuilder()方法创建一个dom解析器实例;dom解析器实例就可以调用parser()方法获取整个xml问答的Document对象。
3 .2 SAX方式(jaxp)
sax是基于事件驱动的api,sax解析xml文档时会向事件处理器发送不同的事件。sax解析器接口和事件处理器接口都在org.xml.sax包中定义。XMLReader即为sax定义的解析器接口,由解析器提供商实现该借口,应用程序需要做的是编写一个事件处理器。可以通过XMLReader的setContentHandler()方法来设置一个事件处理器的实例。
与dom类似,jaxp也为sax解析器提供了抽象工厂类SAXParserFactory类,sax解析器工厂类的实例与dom解析器工厂类的实例类似,都是通过newInstance()方法来创建,不同的是SAXParserFactory的newInstance()方法查找的工厂类属性是:javax.xml.parsers.SAXParserFactory。同样,获取sax解析器实例的方法,可以通过调用newSAXParser()。
使用SAXParser和XMLReader都可以用来对xml文档进行解析,前者只是对后者又一次的包装。
3.3 JDOM
dom被设计用于完成几乎所有的xml操作任务,同时又是与语言无关的,这就导致dom的api庞大而且复杂。为了使java程序员更方便地处理xml文档,两位国外的java技术专家创建了jdom。用developerworks上的一句话,“延续开源社群有需要就创建工具的历史传统,Java 技术专家 Jason Hunter 和 Brett McLaughlin 缔造了 JDOM”。所以可以认为,jdom是一种专门用于java语言解析xml文档的开放源代码框架。
jdom也使用对象树来表示xml文档,底层使用sax解析器分析xml文档,形成jdom树。
3.4 DOM4J
同jdom一样,dom4j也是应用于java平台,提供简单、灵活的处理xml文档的开发源代码库。很有意思的是,dom4j是由早期开发jdom的人分离出来而后独立开发的,(利益或意见不和?呵呵)与jdom相比,dom4j提供了更好的灵活性。从网上的评论可以看出,dom4j从性能、功能、易用性上都优于jdom,可以作为解析xml文件的首选。(看来后来分离出的那拨人选择还是正确的!)流行的hibernate,jaxm都采用了dom4j处理xml文件。
dom4j也使用sax解析器来分析xml文档,形成dom4j树;它也提供了用于大文档的基于事件的处理模型。
所以可以看出,jdom和dom4j只是开源社区产生出来的方便地解析xml的框架或工具,并没有创造新的xml解析方式。如果拿以上四种解析xml的方法比较,用孙鑫老师的话,如果你需要频繁更换解析器就是jaxp方式,否则推荐使用dom4j。
4. StAX
在传统的dom和sax解析方式的基础上,java1.6新增了StAX(Streaming API for XML) 的基于事件迭代器 API 无论在性能还是在可用性上都有其他 XML 处理方法所不及的独到之处。
java 解析3层xml_java xml 解析方式汇总#高级程序员必备技能#相关推荐
- java高级内容_Java高级程序员必备的内容知识
一段时间没有回顾多线程相关知识了,虽然工作中会用到一些多线程的内容,但都偏向于基础,今天java培训带大家重读多线程相关内容,发现有些东西还是需要注意下.这些一般是面试高频问题奥. 了解并发的内幕是一 ...
- Java程序员必备技能
学习Java半年了,我觉得一个Java程序员应该必备一下技能 1.基本语法 static,final,volatile,transient,public,protected,private,synch ...
- Java进阶高级程序员必备:深入浅出springboot+深入Java虚拟机
收集了2份文档资料:深入浅出springboot和深入Java虚拟机,希望能对想要进阶的小伙伴有所帮助 深入浅出springboot Spring Boot是一个微服务架构的框架,那么为什么要使用Sp ...
- 吐血整理-高级程序员必备Java并发编程原理,没时间看建议收藏
简介: Java线程之间的通信对程序员完全透明,内存可见性问题很容易困扰Java程序员,这一系列几篇文章将揭开Java内存模型的神秘面纱.这一系列的文章大致分4个部分,分别是: Java内存模型基础, ...
- 求n的阶乘的算法框图_当代程序员必备技能(算法)之:递归详解 - Java斗帝之路...
前言 递归是一种非常重要的算法思想,无论你是前端开发,还是后端开发,都需要掌握它.在日常工作中,统计文件夹大小,解析xml文件等等,都需要用到递归算法.它太基础太重要了,这也是为什么面试的时候,面试官 ...
- 资料汇总--java开发程序员必备技能
1. 熟练使用Java语言进行面向对象程序设计(面向对象:继承.多态.抽象): 有良好的编程习惯(阿里开发手册 链接:http://pan.baidu.com/s/1dFEA6cT 密码:kqj4 ...
- Java高级程序员必备:高性能计数器及Striped64和LongAdder
基于JDK 7,我们如何实现一个多线程计数器?一般做法是定义一个volatile long或定义一个AtomicLong(底层也是volatile long),然后在每个线程中用CAS操作对它进行ad ...
- Android开发java开发之常用英文词汇汇总。程序员必备英语单词
ANR (Application Not Response ) bundle 捆, entire 整个的,完整的 lifetime 生命周期 entire lifetime 完整生命周期 visibl ...
- python3 获取file大小_Python 3.x 连接数据库(pymysql 方式),程序员必备知识点
由于 MySQLdb 模块还不支持 Python3.x,所以 Python3.x 如果想连接MySQL需要安装 pymysql 模块. pymysql 模块可以通过 pip 安装.但如果你使用的是 p ...
最新文章
- 【树莓派 Raspberry-Pi 】系统安装及一些必要的配置
- 面试:说说你对 HashMap 的认识?
- 上传文件漏洞防御手段
- 启动tomcat遇到的问题整理
- go编译库给c语言函数返回值,go语言 函数return值的几种情况
- 开关电源之EMI设计
- Android屏幕计算正方形,Android Camera 正方形预览(二)
- log4j mysql_log4j写入mysql数据库 | 学步园
- BZOJ2002: [Hnoi2010]Bounce 弹飞绵羊(LCT)
- 各类编程视频教程资源
- EVC下如何直接访问寄存器?
- PS画直线虚线及图形虚线
- python展示水果价格_小姨开水果店的,所以今天用Python写了一个水果店小系统!...
- php身份证实名认证接口
- 患上糖尿病,为什么要做OCT眼底照相检查?
- 计算机里的云文档怎么锁,怎么把云文档放到桌面上
- PMP续证 | PDU具体操作图解
- Java面试题:GC 是什么? 为什么要有GC?
- matlab中sym(3 4),Matlab中sym 的用法
- PCB生产时“补偿”“开窗”是什么意思