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)大阿福 (toafu@msn.com) |
| .... 4月18日,爱因斯坦50周年祭日(ip)www.JavaGarden.net (turbochen@163.com) |
.--------------------------------------------------------------------.
[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