dom
(作者:陈广佳)
本文并不意图对JDOM这种用于快速开发XML的第三方工具包进行详尽的介绍或要涵盖JDOM对XML的所有处理方法,因为这方面的文章及资料已经很丰富,仅希望能通过本人使用JDOM进行具体开发的事例给没有用过或刚开始使用JDOM的朋友们一个对该API较具形态的一点认知。
项目概述以及XML API的选择--JDOM API
本人所在的出版社近期将中日韩文工具书转成了电子资料,在开发教学多媒体的同时希望能够开发基于网络的电子辞典(先进行日文外来语词典的开发),后一项目由本人负责。由于项目将以JAPPLET作为客户端的选择,而词库资料以XML文档形式提供,因此我开始收集JAVA对XML处理的相关资料。我最先是在JAVA.SUN.COM上看到JDOM的有关介绍,在访问了JDOM ORG的网站以及看了几篇对JDOM叙述得很好的文章后,我决定使用JDOM来完成该项目中对XML的处理。
JDOM API版本是在JDOM ORG上下载的JDOM Beta6,现在最新的版本是JDOM Beta7,相对于Beta6,Beta7进行了极大的改进。(下载JDOM的最新版本)
我使用JBUILDER3进行开发,JDOM需要做为一个增加的类库加进其JAVA Libraries里。我的JDOM是装在E盘的根目录下,配置如下:
NAME:JDOM
CLASS PATH:E:\jdom6bt\jdom-b6\build\jdom.jar
SOURCE PATH:E:\jdom6bt\jdom-b6\src\java.zip
DOC PATH:E:\jdom6bt\jdom-b6\build\jdom.jar
但JBUILDER5已经对JDOM有直接的支持,JDOM API已经内嵌在其JAVA Libraries里,这样我们使用JDOM就更方便。
词库数据资料XML文档结构
在该项目中XML的文档结构比较简单,以<dict>为根,主体以日文片假名词条为单元(<word>),下面分别以<spell><prop><mean>各子元素对应片假名拼写、外来语拼写、中文解释各项内容:
该项目中,所使用的XML并不是使用JDOM生成,但要使用JDOM生成同样的XML结构也是很简单的,以下是简单实现代码片段:
由于要支持多国语,所以XML以UTF-8编码,这里需要说明的是,JDOM的XMLOutputer默认输出字符编码为UTF-8,如果要输出别种编码,可使用outputter.setEncoding()进行设定(请参考http://www.jdom.org/docs/faq.html)。在该FAQ里只说明了OUTPUT的编码情况,但是并没有说明JDOM在输入处理XML时对编码的要求,我开始使用时XML文档是以UCS-2编码的,但JDOM并不能正常处理,出现的错误:
org.jdom.JDOMException:Error in building:The name""is not legal for JDOM/XML elements:XML names cannot be null or empty
在改用了UTF-8编码后,JDOM对XML的处理就能正常进行,不知是否与JAVA内部的UNICODE编码于外来文件的UNICODE编码高低字节有关(对于处理一般的UNICODE文件,在输入时,需要把文件的高低字节互换才能使JAVA对其进行无误的处理),我暂时还没找到有关的资料。
使用JDOM实现电子辞典的词条查询功能
要实现的查询功能主要有两个,①按日文片假名模糊查询、②按外来语模糊查询:
(这里的模糊查询只展示简单的首字符相同&字符数相同的查找法则)这里仅挑取与JDOM有关的语句展示:
使用JDOM为XML文档增加子元素
为了要往XML资料文档里增加韩国方面将完成的韩文翻译存放空间,需要往XML文档里增加子元素-koreamean,增加子元素的实现与上面所介绍的生成XML文档差不多,仅借此简单举一个JDOM文档输出的例子,以及提一下本人在处理时所遇到的一些问题。
程序片段:
结果:
我首先使用的是用FileWrieter类输出,输出的效果是可以输出XML档,却出现不能把所有内容全部输出的情况,最后一部分的词条被遗漏,怀疑是使用FileWriter类输出文件长度受限制的原因。
于是使用FileOutputStream类进行重新输出,输出结果就完全正确了。
小结
JDOM具有丰富、强大的XML处理能力,本文仅用实例有限的展示了其中几项常用的功能,相信随着JDOM正式被接受成为Java规范要求,它的应用越来越广范,读者们会看到更多更系统的对JDOM的应用例示。
参考资料
JDOM ORG网站
JSRs:Java Specification Requests Detail-- JSR 102 JDOM 1.0
Easy Java/XML integration with JDOM--By Jason Hunter and Brett McLaughlin http://www.javaworld.com/javaworld/jw-05-2000/jw-0518-jdom.html
http://www.ibiblio.org/xml/slides/nypc/jdom/