JAXP是sun提出的一个规范,用于定义如何解析和转换xml文档的接口,目前版本已经达到1.3,根据解析转换供应商无关性,解析器和转换器可以在具体运行时进行多样更换。这本身对于应用开发来说是一个福音。但是目前jaxp在国内的使用并不是想象中那样的广泛,这也是由于一定的市场原因存在(对于不同版本的jvm的支持的需求)。
现在更多的应用采用dom4j和jdom,其操作接口更为简便。
个人以为,dom4j(不太了解jdom)并不是严格意义上的xml解析器,其底层也是采用符合jaxp规范的具体实现,并且dom4j的文档中表明,可以和jaxp协同工作,采用jaxp已经config好的解析器和转换器。
在dom4j最新发布版本1.5.2中,由于许可证的问题,内部去除了解析器Aelfred2的实现,这下是否更应该依赖于底层的crimson.jar or xerces.jar,而二者是遵循jaxp规范的。
具体知识还在研究中。
对此与www.JavaGarden.net的一段讨论:
.--------------------------------------------------------------------.| Session Start: 2005年4月6日 || Participants: || (sn)大阿福 (
[email protected]) || .... 4月18日,爱因斯坦50周年祭日(ip)www.JavaGarden.net (
[email protected]) |.--------------------------------------------------------------------.[16:39:28] (sn)大阿福: http://blog.csdn.net/toafu/archive/2005/04/06/338337.aspx[16:39:34] (sn)大阿福: 我理解的对吗?[16:41:57] Turbo, A bea: good[16:42:52] (sn)大阿福: 可是我怎么找不到我直接使用dom4j的时候,它是怎样于jaxp发生关联的。当类路径里面有二者的时候。[16:46:18] Turbo, A bea: jaxp不是有几个factory吗,就是从这入手的.[16:47:06] (sn)大阿福: 可是我没有看到dom4j对这几个factory有什么实现?[16:48:24] Turbo, A bea: 我记得在一个什么文章上看到过, 好像是从factory上入手, 传入一个class之类的. 具体用什么方法还得去查查.[16:49:08] (sn)大阿福: 就是跟dom4j发生关联的?[16:49:41] Turbo, A bea: 你应该还记得jdbc的驱动是怎么加载的, 跟那个原理类似.[16:50:37] (sn)大阿福: 按顺序找几个路径下是否有可加载的类[16:51:23] Turbo, A bea: 不是, 是DriverManager.forName("classname"); 类似这样的方式.[16:51:32] (sn)大阿福: 对[16:53:52] (sn)大阿福: 是不是这样理解,dom4j是不遵从jaxp规范的实现,同样底层是那些遵从了jaxp规范的xml解析器,只是因为dom4 j提供了很简便的接口而应用广泛[16:55:49] Turbo, A bea: 我觉得是dom4j遵从了jaxp规范, 并加以扩展, 使API更容易使用. 我没有实际用过dom4j, 但知道它比jaxp的dom api好用很多. 我之前开发全用是jaxp 的 dom api, 取一个元素代码很啰嗦.[16:56:40] Turbo, A bea: 而jdom才是切头切尾的没遵从jaxp规范[16:56:52] Turbo, A bea: 不易移植.[16:57:14] (sn)大阿福: 好。我想知道的是,如果dom4j和jaxp的api都在classpath下时,如果能够实现直接操作jaxp接口而保证底 层用dom4j实现的呢?[17:00:08] Turbo, A bea: How does dom4j relate to DOM? DOM is a quite large language independent API. dom4j is a simpler, lightweight API which is optimised for the Java making extensive use of the Java 2 platform such as the Java 2 collections. Though dom4j fully supports the DOM standard allowing both APIs to be used easily together.[17:00:19] Turbo, A bea: 上面这段是dom4j的FAQ的内容[17:00:57] Turbo, A bea: dom4j fully supports the DOM standard allowing both APIs to be used easily together.[17:01:07] Turbo, A bea: 上面这句最关键[17:01:52] (sn)大阿福: 不太明白什么意思[17:02:28] (sn)大阿福: both是指?[17:02:49] Turbo, A bea: 应该是指dom4j和dom[17:03:05] Turbo, A bea: together证明了这点[17:03:10] (sn)大阿福: 哦?[17:04:53] Turbo, A bea: 再看这一句: Dom4j works with any SAX parser via JAXP. [17:05:37] (sn)大阿福: 呵呵,我就想知道它是如何work with的,或者咱们在代码里写的时候如何融合dom4j和jaxp[17:05:40] Turbo, A bea: 这就意味者,只要是符合jaxp规范的sax parser, 都可以作为dom4j的sax parser使用.[17:07:00] (sn)大阿福: 你这句没错[17:08:04] (sn)大阿福: 那就是说dom4j和jaxp是并列的,只是dom4j不是规范而已,是吗[17:08:58] Turbo, A bea: 我觉得jaxp是规范,而dom4j是规范的扩展.[17:09:35] (sn)大阿福: 而xerces等是规范的实现[17:09:55] Turbo, A bea: 是啊[17:10:21] (sn)大阿福: 是不是jaxp还未直接支持xpath,所以易用性不如dom4j[17:10:35] Turbo, A bea: 其实, jaxp最初的实现是由apache捐现的, [17:10:47] (sn)大阿福: 所以xml解析器就是apache的[17:10:59] Turbo, A bea: 还未完全实现xpath, 不知java5实现的如何了.[17:11:10] Turbo, A bea: 是啊[17:11:29] (sn)大阿福: 新的1.3支持java5,呵呵[17:11:36] (sn)大阿福: 好,多谢指教[17:13:40] Turbo, A bea: http://www.pconline.com.cn/pcedu/empolder/wz/xml/0412/50976 2_1.html[17:13:52] Turbo, A bea: 这个文章可以一看,但不可全信.[17:14:04] (sn)大阿福: OK,3ks[17:17:50] Turbo, A bea: http://www.54bk.com/more.asp?name=captain&id=1887 这个文章就可以看明白它们的关系了[17:19:36] (sn)大阿福: dom4j应用程序 -> dom4j API -> Xerces/Crimson解析器 dom4j应用程序 -> dom4j API -> Alfred2解析器[17:20:01] (sn)大阿福: dom4j默认都是用第一行的解析器吧[17:20:09] Turbo, A bea: apache的Xerces/Crimson解析器是核心,[17:20:15] (sn)大阿福: 嗯[17:20:24] Turbo, A bea: 其它类型的api都是用这些解析器.[17:20:34] (sn)大阿福: Alfred2已经在dom4j[17:20:44] (sn)大阿福: 1.5.2中remove掉了[17:20:56] Turbo, A bea: 是的[17:22:12] (sn)大阿福: 所以jaxp和dom4j之间并没有规范和实现的关系,而dom4j使用实现了jaxp规范的apache的解析器来解析xm l文档。[17:22:24] (sn)大阿福: 感觉轮廓渐渐清晰了[17:22:36] Turbo, A bea: 而jaxp定义的接口,包括dom和sax接口.[17:22:54] Turbo, A bea: 然后jaxp也有自己的dom和sax实现.[17:23:16] (sn)大阿福: 那就是jaxp RI[17:24:07] (sn)大阿福: 是sun做的。sun定义了jaxp规范,完了又实现了自己的一套api,解析器同样用apache的[17:24:45] (sn)大阿福: dom4j是未遵从jaxp规范实现了一套更易用的api,解析器也是用apache的[17:25:42] (sn)大阿福: dom4j文档中描述:当jaxp的jar在类路径中是,dom4j使用的解析器会依据jaxp配置中的进行选择。[17:27:09] Turbo, A bea: 所以'work with jaxp'的意思是指符合jaxp 规范的parser.[17:28:09] (sn)大阿福: 对,work with xml parsers obeying jaxp