【Java Web】——Java访问XML理论篇

【前言】

   在学习DRP分销资源管理系统的时候,王勇老师留了个作业,那就是用dom4j来解析XML配置文件,而在前面的视频中它讲了Java中解析XML的两种方式:SAX和DOM,还有几种方法:SAX,STAX,DOM,JDOM,DOM4J。简单介绍了一下这几种方法,于是我就在想为什么它最后选的是dom4j,而不是其他的呢?这只有都用过了,对比之后才知道呢,所以我就用这几种方法都做了个Demo,看一下到底是怎么回事儿?本篇博客,先普及一下理论知识。


【解析XML两种方式】


 两种XML访问方式:面向事件SAX-SAX;面向模型DOM-DOM。

1、面向事件——SAX-SAX


  利用SAX封装类来逐步解析。
  主要方法有:SAX和STAX

2、面向模型——DOM-DOM


  通过加载整个XML文件生成Document文档,然后解析Document文档内容的树和根。
  主要方法有:DOM,JDOM,DOM4J

【两种方式对比】


一、SAX-STAX


   基于流机制的处理方式,在处理XML文档时,从头开始,读取一段,处理一段,并不是将整个树结构文档都读出来。

   1、SAX

    Simple API for XML,它是一个基于XML事件驱动的“推”模型。SAX解析器在读取文档时激活一系列事件,然后这些事件被推给事件处理器,然后由事件处理器提供对文档内容的访问。

   常见的三种事件处理器:            
   (1)用于访问XML DTD内容的DTDHandler;
   (2) 用于低级访问解析错误的ErrorHandler;
   (3)用于访问文档内容的ContentHandler,这也是最普遍使用的事件处理器。

    优点:内存消耗小,适合于解析大于系统内存的文档,无需像DOM一样为所有节点创建对象。而SAX的“推”模型可用于广播环境,能够同时注册多个ContentHandler,并行接收事件,而不是在一个管道中一个接一个的处理。

    缺点:必须实现多个事件处理程序以便能够处理所有到来的事件,同时还必须在应用程序代码中维护这个事件状态,因为SAX解析器不能交流元信息,如DOM的父/子支持,所以你必须跟踪解析器处在文档层次的哪个位置。如此一来,你的文档越复杂,你的应用逻辑就越复杂。虽然没有必要一次将整个文档加载到内存中,但SAX解析器仍然需要解析整个文档,这点和DOM一样。

    SAX只能按顺序访问,不能够随机访问。

    2、STAX

    它是针对XML的流式API,一种"拉"分析模型,并且是JDK6.0提供的一种新特征,一个推模型分析器不断地生成事件,直到XML文档被完全分析结束。但是,拉分析由应用程序进行调整;因此,分析事件是由应用程序生成的。这意味着,使用StaX,你可以推迟分析-在分析时跳过元素并且分析多个文档。在使用DOM API的时候,你必须把整个的XML文档分析成一棵DOM结构,这样也就降低了分析效率。而借助于StAX,在分析XML文档时生成分析事件。

    STAX,它提供了专用的输出类,而DOM和SAX需要借助于Transformer类。

对比:一个推模型类似于我们观察者模式的推送,一个拉分析模型,我想这就是两者之间最大的区别。

二、DOM-JDOM-DOM4J


    先在内存中建立DOM树,然后通过遍历或者修改树节点,来对XML文档内容进行处理。

    1、DOM

    它是通用的,它是用于平台和语言无关的方式表示XML文档的官方W3C标准, 它是以层次结构组织的节点的集合,并允许开发人员在树中查找特定的信息, DOM基于树的处理有以下几个优点和缺点:
    优点:
   (1)可以对数据和结构做出更改,因为树在内存中是持久的。
   (2)可以在任何时候在树中进行上下导航,使用起来比较简单。
缺点:
    对于特别大的文档,加载整个文档会很慢,并且很耗资源。

   2、JDOM

   它是第一个Java特定模型,它使用具体类而不使用接口,简化了某些API,而且API中使用了大量的Collection。

   JDOM文档声明其目的是:使用20%的精力解决80%的Java/XML问题。

   JDOM自身不包含解析器,通常使用SAX2解析器来解析和验证输入XML文档,但它包含一些转换器以将JDOM表示输出成SAX2事件流、DOM模型或XML文本文档。

    3、DOM4J

    它起初是JDOM的智能分支,合并了许多超出基本XML文档表示的功能,包括集成XPath支持,XML Schema支持以及用于大文档或流化文档的基于事件的处理, 它使用接口和抽象基本类方法,大量使用API中的Collections类,它付出了更复杂的API代价,但是比JDOM更加灵活。

对比:通过对比可看出,DOM-JDOM-DOM4J是越来越灵活的,越来越方便,而且它提供的API也越来越复杂。

【总结】


   这两种访问方式之间的区别就是DOM是基于文档的,而SAX是基于事件流的。访问比较小的文档可以用DOM方式,最好用的是DOM4j,而访问比较大的文档则使用SAX方式,这样就不用加载整个文档了。
        





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 27
    评论
评论 27
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

幸运的梦之星

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值