java解析xml文档的几种方式,概论

来源:互联网 发布:apache网络服务器 编辑:程序博客网 时间:2024/06/01 19:59

底层解析方式

1. DOM解析(Document Object Model)

  • w3c官方的标准,允许获取和操作文档的任意部分。
  • 缺点
    • 通常需要加载整个xml文档来构造层次结构,消耗资源较大。
  • 优点
    • 允许应用程序对数据和结构做出更改
    • 访问是双向的,可以在任何时候在树中上下导航,获取和操作任意部分的数据

2. SAX解析(Simple API for XML)

  • 通过流模式中的推模型分析方式读取,通过事件驱动,每发现一个节点就会引发一个事件,通过回调方法完成解析工作,解析XML文档的逻辑需要应用程序完成。推模式的,所有的操作在解析器自动控制下进行,所有事件都会处理,不管需不需要解析整个文档,解析器都会自动启动解析任务,然后按顺序向下解析,直到解析完成才终止
  • 缺点
    • 需要应用程序自己负责标签的处理逻辑,使用麻烦
    • 单项导航,很难同时访问同一文档中的不同部分数据,不支持XPath
  • 优点
    • 不需要加载全部文档,即可立即分析
    • 只在读取数据时检查数据,不需要保存在内存
    • 效率和性能较高,能解析大于系统内存的文档

包装底层的解析方式

JDOM解析(Java-based Document Object Model)

  • JDOM文档声明其目的是“使用20%(或更少)的精力解决80%(或更多)Java/XML问题”,极大减少了代码量。而JDOM和DOM4J则是基于底层API的更高级封装。DOM是通用的,而JDOM和DOM4J则是面向java语言的。JDOM是处理XML的纯JavaAPI,使用具体类而不是接口。JDOM是基于树的处理XML的JavaAPI,把树加载到内存中,同时又有SAX的Java规则。JDOM与DOM主要有两方面不同。首先,JDOM仅使用具体类而不使用接口。这在某些方面简化了API,但是也限制了灵活性。第二,API大量使用了Java集合类,便于Java开发者使用。JDOM自身不包含解析器。它通常使用SAX2解析器来解析和验证输入XML文档(尽管它还可以将以前构造的DOM表示作为输入)。它包含一些转换器以将JDOM表示输出成SAX2事件流、DOM模型或XML文本文档。
  • 缺点
    • 没有较好的灵活性
    • 性能较差
    • 不能处理大于内存的文档
  • 优点
    • 使用具体的类,而不是接口,简化了DOM的API
    • 大量使用了Java集合类,方便Java开发人员

DOM4J(Document Object Model for Java)

  • 简单易用采用Java集合框架,并完全支持DOM,SAX和JAXP,开放源代码。你可以看到越来越多的Java软件都在使用DOM4J来读写XML,特别值得一提的是连Sun的JAXM也在用DOM4J。目前许多开源项目中大量采用DOM4J,例如大名鼎鼎的Hibernate也用DOM4J来读取XML配置文件
  • 缺点
    • 大量使用的API接口,API较为复杂
  • 优点
    • 大量使用了Java集合类,方便Java开发人员,同时提供一些高性能的替代方法
    • 支持XPath
    • 有很高的性能

StAX | PULL (Streaming API for XML)

pull 是StAX的一个实现

  • 通过流模式中的拉模型分析方式,提供基于指针和迭代器两种支持的方式,StAX 是拉模式的,可以由用户根据需要控制需要处理事件类型及何时终止解析任务,用户调用一次next(),解析器就进行一次向下解析,完全在用户的控制下进行解析操作,在需要的解析工作已经完成时,可以随时终止解析。
  • 缺点
    • 单向导航,不支持XPath,很难访问同一文档中的不同部分
  • 优点
    • 接口简单,使用方便
    • 可以在某个条件得到满足时停止分析,不必解析整个文档
    • 采用流模型分析方式,有较好的性能

比较不同解析方式的性能于差异

创建三个不同大小的XML文档

  • smallusers.xml(100KB)
  • middleusers.xml(1MB)
  • bigusers.xml(10MB)
    分别用以上五种解析方式对这三个XML进行解析,然后打印出所有的用户信息,并分别计算它们所用的时间

单位:s(秒)

100KB 1MB 10MB DOM 0.146s 0.469s SAX 0.110s 0.328s JDOM 0.172s 0.756s DOM4J 0.161s 0.422s StAX Stream 0.093s 0.334s StAX Event 0.131s 0.359s
  • 由上面的测试结果可以看出,性能表现最好的是SAX,其次是StAX Stream和StAX Event,DOM和DOM4J也有着不错的表现。性能最差的是JDOM。
  • 所以,如果你的应用程序对性能的要求很高,SAX当然是首选。如果你需要访问和控制任意数据的功能,DOM是个很好的选择,而对Java开发人员来讲,DOM4J是更好的选择。
  • 如果只需要做XML文档解析的话,综合性能、易用性、面向对象特征等各方面来衡量,StAX Event无疑是最好的选择。