因为要xml格式存取数据,所以学习一下dom4j。
学习的例子来自IBM中国研发中心的一篇文章(http://www-128.ibm.com/developerworks/cn/xml/x-dom4j.html)。在其中遇到几个问题,解决过程走了很多弯路,记录如下:
1,把第二个java类运行后遇到如下错误:
c Nested exception: c
后来在javaeye找到了答案(原文忘了,不做链接了)解决方法如下:
把catalog.xml中的那句文档类型声明(
<!DOCTYPE catalog SYSTEM "file://c:/Dtds/catalog.dtd">
)删除。
注意不要多删了回车符,我刚开始的时候也尝试删除文档类型声明,但是因为多删了回车,然后出现另外一种异常(再一次陷入困境),走了不少弯路。
2,问题1解决后又出现另外一种异常
Exception in thread "main" java.lang.NoClassDefFoundError: org/jaxen/JaxenException
解决方法很简单,下载dom4j-1.6.1.zip,里面有一个jaxen-1.1-beta-6.jar导入到项目即可(将jaxen-1.1-beta-6.jar加入到classpath里面去)
3,在向xml文件中写入中文字符时遇到如下异常
Invalid byte 1 of 1-byte UTF-8 sequence. Nested exception: Invalid byte 1 of 1-byte UTF-8 sequence.
上网搜索得到解决办法(代码说明):
//原始代码
// XMLWriter output = new XMLWriter(
// new FileWriter( new File(fileName )));
// output.write( document );
// output.close();
//正常工作的代码,替换上面的代码即可
java.io.Writer wr=new java.io.OutputStreamWriter(new java.io.FileOutputStream(fileName),"UTF-8");
document.write(wr);
wr.close();
原因分析:
由于FileWriter默认的输出编码是ANSI编码,而Dom4j中的wirte方法提供的内容实际是以UTF-8保存的,因此造成了包括中文字符的XML文件无法正常阅读。
解决方法:
不能使用简单的FileWriter,而应该是使用一个能指定具体输出编码的Writer,在JDK的io包中, OutputStreamWriter可以指定输出编码。
(本问题参考:http://www.javaresearch.org/article/55185.htm)