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 解析方式汇总#高级程序员必备技能#相关推荐

  1. java高级内容_Java高级程序员必备的内容知识

    一段时间没有回顾多线程相关知识了,虽然工作中会用到一些多线程的内容,但都偏向于基础,今天java培训带大家重读多线程相关内容,发现有些东西还是需要注意下.这些一般是面试高频问题奥. 了解并发的内幕是一 ...

  2. Java程序员必备技能

    学习Java半年了,我觉得一个Java程序员应该必备一下技能 1.基本语法 static,final,volatile,transient,public,protected,private,synch ...

  3. Java进阶高级程序员必备:深入浅出springboot+深入Java虚拟机

    收集了2份文档资料:深入浅出springboot和深入Java虚拟机,希望能对想要进阶的小伙伴有所帮助 深入浅出springboot Spring Boot是一个微服务架构的框架,那么为什么要使用Sp ...

  4. 吐血整理-高级程序员必备Java并发编程原理,没时间看建议收藏

    简介: Java线程之间的通信对程序员完全透明,内存可见性问题很容易困扰Java程序员,这一系列几篇文章将揭开Java内存模型的神秘面纱.这一系列的文章大致分4个部分,分别是: Java内存模型基础, ...

  5. 求n的阶乘的算法框图_当代程序员必备技能(算法)之:递归详解 - Java斗帝之路...

    前言 递归是一种非常重要的算法思想,无论你是前端开发,还是后端开发,都需要掌握它.在日常工作中,统计文件夹大小,解析xml文件等等,都需要用到递归算法.它太基础太重要了,这也是为什么面试的时候,面试官 ...

  6. 资料汇总--java开发程序员必备技能

    1.  熟练使用Java语言进行面向对象程序设计(面向对象:继承.多态.抽象): 有良好的编程习惯(阿里开发手册  链接:http://pan.baidu.com/s/1dFEA6cT 密码:kqj4 ...

  7. Java高级程序员必备:高性能计数器及Striped64和LongAdder

    基于JDK 7,我们如何实现一个多线程计数器?一般做法是定义一个volatile long或定义一个AtomicLong(底层也是volatile long),然后在每个线程中用CAS操作对它进行ad ...

  8. Android开发java开发之常用英文词汇汇总。程序员必备英语单词

    ANR (Application Not Response ) bundle 捆, entire 整个的,完整的 lifetime 生命周期 entire lifetime 完整生命周期 visibl ...

  9. python3 获取file大小_Python 3.x 连接数据库(pymysql 方式),程序员必备知识点

    由于 MySQLdb 模块还不支持 Python3.x,所以 Python3.x 如果想连接MySQL需要安装 pymysql 模块. pymysql 模块可以通过 pip 安装.但如果你使用的是 p ...

最新文章

  1. 【树莓派 Raspberry-Pi 】系统安装及一些必要的配置
  2. 面试:说说你对 HashMap 的认识?
  3. 上传文件漏洞防御手段
  4. 启动tomcat遇到的问题整理
  5. go编译库给c语言函数返回值,go语言 函数return值的几种情况
  6. 开关电源之EMI设计
  7. Android屏幕计算正方形,Android Camera 正方形预览(二)
  8. log4j mysql_log4j写入mysql数据库 | 学步园
  9. BZOJ2002: [Hnoi2010]Bounce 弹飞绵羊(LCT)
  10. 各类编程视频教程资源
  11. EVC下如何直接访问寄存器?
  12. PS画直线虚线及图形虚线
  13. python展示水果价格_小姨开水果店的,所以今天用Python写了一个水果店小系统!...
  14. php身份证实名认证接口
  15. 患上糖尿病,为什么要做OCT眼底照相检查?
  16. 计算机里的云文档怎么锁,怎么把云文档放到桌面上
  17. PMP续证 | PDU具体操作图解
  18. Java面试题:GC 是什么? 为什么要有GC?
  19. matlab中sym(3 4),Matlab中sym 的用法
  20. PCB生产时“补偿”“开窗”是什么意思

热门文章

  1. php 微信小程序虚拟支付,为什么有些小程序可以做虚拟支付
  2. url-rewrite
  3. C++实现BMP转RAW
  4. 虚拟计算机可以开机吗,电脑开机后会提示虚拟空间太低怎么办
  5. 识别扫描票据软件哪个好?不妨试试这几个不错的识别软件
  6. 拜佛与拜神有什么差别?
  7. 无线投屏同屏- HDMI1.3 手机投/同屏芯片方案
  8. 8.DLL导出C++类
  9. [C++] 使用 cryptopp 加密解密
  10. HTML文本标记(一)