Java里边解析xml一般有三种常用的技术:
1、 Document Object Model (DOM),W3C里边一种成熟的标准。目前广泛使用的解析工具:JDOM DOM4J
2、 Simple API for XML (SAX),第一种被广泛接受的XML的API,成为事实上的标准。
3、 Streaming API for XML (StAX),在JSR-173中提到的一种很有前途的新型解析模型。
DOM解析是基于树结构的,它通过在内存构建整棵文档树,允许完全、动态访问XML文档的任何节点。在XMPP应用中,如果使用dom解析xml,会耗费很多时间,增加请求返回的时间。
2、SAX
SAX解析XML采用事件驱动的方式。虽然并不是W3C的标准,但它的API是公认的,很多解析器都是基于它的。当SAX解析器读取文档的时候会引发很多事件,这些事件会交给对应的事件处理者(event handlers),控制权是在解析器,应用程序只是时间的接收者,由解析器调用应用程序注册的callback接口实现事件通知。三种基本的事件:
1. DTDHandler 访问XML的DTD内容
2. ErrorHandler 解析错误
3. ContentHandler 访问文档的内容
3、 StAX
StAX是一种令人振奋的新型解析技术,和SAX一样,它也采用了事件驱动模型。不过,在对于事件的处理上,SAX采用了“推模式”(push modal),而StAX则使用的是“拉模式”(pull model)。说得更加明白一些,就是这样:
SAX是自己按顺序把整个文档解析完,在它解析的过程,会主动产生事件交给程序中相应的处理函数来处理当前内容;而StAX是由程序来驱动整个解析过程,只有当程序发出解析请求的时候,解析器才会告诉相应的事件,然后程序根据事件再决定如何处理当前内容,应用程序可以将 事件对应的节点DOM载入内存中进行处理。
从这个原理来判断的话,StAX的实现显然要更加灵活,程序可以选择自己需要处理的部分,而SAX则一定会遍历整个文档。而据我的理解,将StAX叫成“程序驱动模型”可能更利于理解一些。
读取XML文档:
Iterator xml:方便的、容易使用的、迭代器风格的 API。更面向对象编程,对程序感兴趣的事件创建相应的对象,容易添加和删除事件event,易用扩展。
Cursor xml:
尽管迭代器风格的 API 非常方便和易于使用,它也带来了一些开销。解析器需要创建事件对象,这些对象在以后被无用单元收集器回收。对于高性能极其重要的应用程序(如J2ME),您可以选择基于指针的 API。XMLStreamReader 类型的特点是 next() 方法提交一个整数值(而不是事件对象)表示事件类型。客户机应用程序可以查询阅读器获得其他的信息。
应用程序通过在 XML 标记流中移动逻辑指针来处理 XML。基于指针的解析器实质上是一个状态机,在事件的驱动下从一个良好定义的状态转移到另一个状态。这里的触发事件是随着应用程序使用适当的方法推动解析器在标记流中前进而解析出来的 XML 标记。在每个状态,都可使用一组方法获得上一个事件的信息。一般来说,并非每个状态下都能使用所有的方法。
表格概述:
技术 | 有利 | 局限 | 适用于 |
DOM Parsing | 1.易于上手 2.丰富的API,易于访问 3.整棵树被载入内存,能随机访问节点 | 1.整个文档必须一次解析完 2.载入文档树到内存代价昂贵 3.不利于实现对象类型绑定,需要给所有节点创建单独的类型 | 需要修改xml或者用来处理XSLT(不要用在对XML只有读操作的程序中)
|
SAX Parsing | 1.没有将整个文档读入内存,内存耗费较低 2.“推模式”允许注册多种内容处理器
| 1.没有内建的文档导航支持 2.不能随机访问XML文档 3.不支持命名空间 | 对XML只有读操作的程序(不要用来操作和修改XML文档) |
StAX Parsing | 1.有针对简单和性能的两种解析模式 2.由程序控制解析器,易于支持多输入(easily supporting multiple inputs) 3.强大的过滤功能有利于数据检索 4.支持修改XML文档 | 1.没有内建的文档导航支持 2.不能随机访问XML文档 | 需要对XML文档进行流处理而且支持命名空间的程序(不要用来操作和修改XML文档) |
参考资料:
http://java.sun.com/webservices/docs/1.6/tutorial/doc/SJSXP3.html#wp102139
http://www.ibm.com/developerworks/cn/xml/x-stax1.html
示例代码下载地址: