Java里边解析xml一般有三种常用的技术:
1、 Document Object Model (DOM),W3C里边一种成熟的标准。
2、 Simple API for XML (SAX),第一种被广泛接受的XML的API,成为事实上的标准。
3、 Streaming API for XML (StAX),在JSR-173中提到的一种很有前途的新型解析模型。
DOM解析是基于树结构的,它通过在内存构建整棵文档树,允许完全、动态访问XML文档的任何节点。
2、SAX
SAX解析XML采用事件驱动的方式。虽然并不是W3C的标准,但它的API是公认的,很多解析器都是基于它的。当SAX解析器读取文档的时候会引发很多事件,这些事件会交给对应的事件处理者(event handlers)。三种基本的事件:
1. DTDHandler 访问XML的DTD内容
2. ErrorHandler 解析错误
3. ContentHandler 访问文档的内容
3、 StAX
StAX是一种令人振奋的新型解析技术,和SAX一样,它也采用了事件驱动模型。不过,在对于事件的处理上,SAX采用了“推模式”(push modal),而StAX则使用的是“拉模式”(pull model)。说得更加明白一些,就是这样:
SAX是自己按顺序把整个文档解析完,在它解析的过程,会主动产生事件交给程序中相应的处理函数来处理当前内容;而StAX是由程序来驱动整个解析过程,只有当程序发出解析请求的时候,解析器才会告诉相应的事件,然后程序再决定如何处理当前内容。
从这个原理来判断的话,StAX的实现显然要更加灵活,程序可以选择自己需要处理的部分,而SAX则一定会遍历整个文档。而据我的理解,将StAX叫成“程序驱动模型”可能更利于理解一些。
最后,来个表格进行一下概述:
技术 |
有利 |
局限 |
适用于 |
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.强大的过滤功能有利于数据检索
|
1.没有内建的文档导航支持 2.不能随机访问XML文档 3.不支持修改XML文档
|
需要对XML文档进行流处理而且支持命名空间的程序(不要用来操作和修改XML文档) |