在1998年W3CXML1.0推荐标准发布之后,XML就开始变得很流行。Sun公司就是在那时候规范Java Community Process (JCP),同时JAXP(JSR-05)的第一版在2000早些时候发布了。这个版本得到了很多工业集团的支持,譬如(以年月次序排列)BEA Systems, Fujitsu Limited, Hewlett-Packard, IBM, Netscape Communications, Oracle, and Sun Microsystems, Inc.
JAXP (全称Java API for XML Parsing)的可插拔性(pluggability)在开发社区里引起很大的轰动。这点也是JAXP的精华所在。开发人员可以编写自己的xml处理器,只要它符合JAXP的APIs,这样底层不同的xml处理器可以任意切换而不用改应用程序的代码。
那JAXP到底是什么呢?首先 这个P有点迷惑,它代表Parsing还是Processing呢?
因为JAXP1.0的时候只支持解析(parsing),所以JAXP全称应该是Java API for XML Parsing.
但在JAXP1.1的时候,XSL-T 被推荐用作XML的转换(transformation)处理。很遗憾,当时W3C XLT-T的标准规范(specification)里没有提供任何用来转换(transformation)处理的APIs。因此JAXP1.1的专家组推荐了一组APIs叫Transformation API for XML (TrAX)。
从此JAXP就叫Java API for XML Processing. JAXP通过逐步进化,支持的东西也越来越多。不仅仅是解析xml文件(譬如在解析文档的时候根据schema校验有效性,根据预解析的schema来校验文档有效性,计算XPath 表达式等等)。
由于底层用来处理xml文档的可插拔的processor是任意编写的,只要它符合JAXP的规范,因此JAXP 是一个轻量级的处理xml文件的处理APIs。(译者注:JAXP只是一个api规范而已,真正底层实现是任意的。后面会有具体介绍。)
使用JAXP来解析XML文档
JAXP支持基于对象和基于事件的两种解析方式。基于对象的解析,到目前为止只支持W3C DOM解析,JAXP的专家组可能在JAXP的将来版本中会支持J-DOM规范。基于事件的解析,只有SAX 解析模式被支持,另一个基于事件的解析模式叫Pull Parsing,本来它应该是JAXP的一部分。但是对于Pull Parsing存在有一份不同的JSR (#173)文档,也就是大家所知道的Streaming API for XML (StAX) parsing,现在我们对于那个也没什么更多的可以做了。

Figure 1: Various mechanism of parsing XML
使用SAX来解析XML文档
SAX APIs 是在1998年的早些时候由David Megginson提出的,目标是成为基于事件驱动的xml文档解析模式的标准API(这里你可以的到一些 SAX 的历史信息)。即使这样,SAX仍不是W3C 的REC。但毫无疑问实际中它是行业内解析XML文档的标准。
SAX 是一种基于事件的解析模式,是push-parsing原理,解析文档的时候,当遇到<opening> 标签, </closing>标签 或字符等,SAX 都会产生相应的事件(event)。一个SAX解析器解析XML文档的时候,把文档看作为一个流,依次产生相应的事件报告给已注册的content handler, org.xml.sax.ContentHandler,如果有错误,错误会报告给error handler, org.xml.sax.ErrorHandler.
