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

|