- 浏览: 310878 次
- 性别:
- 来自: 成都
-
文章分类
最新评论
-
tacyuuhon:
这个代码就有问题。当前的 int activeSessions ...
HttpSessionListener统计在线人数 -
yangleilt:
唉。。能通俗的说一下不?你说的这些百科上到处都是的!
LDAP是什么? -
hezhou_0521:
你显示正确了吗?
HttpSessionListener统计在线人数 -
sevk:
我喜欢用vim或gvim,比Ultra Edit 顺手
让Ultra Edit和Keil结合的更紧密
这几天开始学习dom4j,在网上找了篇文章就开干了,上手非常的快,但是发现了个问题就是无法以UTF-8保存xml文件,保存后再次读出的时候会报“Invalid byte 2 of 2-byte UTF-8 sequence.”这样一个错误,检查发现由dom4j生成的这个文件,在使用可正确处理XML编码的任何的编辑器中中文成乱码,从记事本查看并不会出现乱码会正确显示中文。让我很是头痛。试着使用GBK、gb2312编码来生成的xml文件却可以正常的被解析。因此怀疑的dom4j没有对utf-8编码进行处理。便开始查看dom4j的原代码。终于发现的问题所在,是自己程序的问题。
在dom4j的范例和网上流行的《DOM4J 使用简介》这篇教程中新建一个xml文档的代码都类似如下
public void createXML(String fileName) {
document.nbspdoc = org.dom4j.document.elper.createdocument.);
Element root = doc.addElement("book");
root.addAttribute("name", "我的图书");
Element childTmp;
childTmp = root.addElement("price");
childTmp.setText("21.22");
Element writer = root.addElement("author");
writer.setText("李四");
writer.addAttribute("ID", "001");
try {
org.dom4j.io.XMLWriter xmlWriter = new org.dom4j.io.XMLWriter(
new FileWriter(fileName));
xmlWriter.write(doc);
xmlWriter.close();
}
catch (Exception e) {
System.out.println(e);
}
}
在上面的代码中输出使用的是FileWriter对象进行文件的输出。这就是不能正确进行文件编码的原因所在,java中由Writer类继承下来的子类没有提供编码格式处理,所以dom4j也就无法对输出的文件进行正确的格式处理。这时候所保存的文件会以系统的默认编码对文件进行保存,在中文版的window下java的默认的编码为GBK,也就是所虽然我们标识了要将xml保存为utf-8格式但实际上文件是以GBK格式来保存的,所以这也就是为什么能够我们使用GBK、GB2312编码来生成xml文件能正确的被解析,而以UTF-8格式生成的文件不能被xml解析器所解析的原因。
好了现在我们找到了原因所在了,我们来找解决办法吧。首先我们看看dom4j是如何实现编码处理的
public XMLWriter(OutputStream out) throws UnsupportedEncodingException {
//System.out.println("In OutputStream");
this.format = DEFAULT_FORMAT;
this.writer = createWriter(out, format.getEncoding());
this.autoFlush = true;
namespaceStack.push(Namespace.NO_NAMESPACE);
}
public XMLWriter(OutputStream out, OutputFormat format) throws UnsupportedEncodingException {
//System.out.println("In OutputStream,OutputFormat");
this.format = format;
this.writer = createWriter(out, format.getEncoding());
this.autoFlush = true;
namespaceStack.push(Namespace.NO_NAMESPACE);
}
/**
* Get an OutputStreamWriter, use preferred encoding.
*/
protected Writer createWriter(OutputStream outStream, String encoding) throws UnsupportedEncodingException {
return new BufferedWriter(
new OutputStreamWriter( outStream, encoding )
);
}
由上面的代码我们可以看出dom4j对编码并没有进行什么很复杂的处理,完全通过java本身的功能来完成。所以我们在使用dom4j的来生成我们的XML文件时不应该直接为在构建XMLWriter时,不应该直接为其赋一个Writer对象,而应该通过一个OutputStream的子类对象来构建。也就是说在我们上面的代码中,不应该用FileWriter对象来构建xml文档,而应该使用FileOutputStream对象来构建所以将代码修改入下:
public void createXML(String fileName) {
document.nbspdoc = org.dom4j.document.elper.createdocument.);
Element root = doc.addElement("book");
root.addAttribute("name", "我的图书");
Element childTmp;
childTmp = root.addElement("price");
childTmp.setText("21.22");
Element writer = root.addElement("author");
writer.setText("李四");
writer.addAttribute("ID", "001");
try {
//注意这里的修改
org.dom4j.io.XMLWriter xmlWriter = new org.dom4j.io.XMLWriter(
new FileOutputStream(fileName));
xmlWriter.write(doc);
xmlWriter.close();
}
catch (Exception e) {
System.out.println(e);
}
}
发表评论
-
JMS
2009-01-15 10:21 926JMS分为两个部分,一部分是应用程序接口,用于编写发送和接收 ... -
Jsp环境配置
2004-06-23 14:02 720第一部分 JAVA环境安装1.目前J2SDK的最新版本是1.4 ... -
jspSmartUpload
2004-06-23 14:16 626//========upload.html========== ... -
第十讲 JSP和Servlet
2004-06-23 17:09 78210.1 Servlet的概念、配置 ... -
第三篇:Servlet入门篇
2004-06-24 07:00 620严重警告:知道Servlet的人不要往下看<o:p> ... -
第五篇:Struts小试牛刀篇
2004-06-24 07:03 707严重警告:如果你跳过了 ... -
Struts,MVC 的实现
2004-06-24 18:43 841简介小学生也可以在因 ... -
Struts简单介绍
2004-06-24 18:44 914Struts是采用Java Servlet/JavaServe ... -
Struts的体系结构
2004-06-24 18:45 835Struts的体系结构(Struts Framework Ar ... -
Jakarta Struts的七大实战心法
2004-06-24 18:48 636编者按:当作者 Chuck Cav ... -
JavaBean使用技巧
2004-06-28 15:16 637虽然你可以把大段 ... -
getParameterValues用法
2004-07-19 22:26 801<form name="checkform&q ... -
HttpSessionListener统计在线人数
2004-08-31 22:01 1300/** * 编写以下SessionCounter.java * ... -
彻底搞定java文件上传
2004-09-28 15:37 1058JAVA的文件上传遍一直是一个比较关注的问题,而且有几个NB东 ... -
JavaBean 设置关联属性
2004-09-28 15:40 660在一个Bean中设置关联属 ... -
jspSmartUpload上传组件
2004-09-28 15:46 709一、安装篇 jspSmartUpload是由www.js ... -
日前和时间的操作
2004-09-29 20:52 650一、JAVA中日期的获取、设置和格式化1)JAVA提供了3个日 ... -
常用的分页函数
2004-10-04 13:47 592方法大致有三种: 1:)用next()方法:(最通用的方法 ... -
用Javamail写的邮件接收程序
2004-10-05 08:59 802package coffeecatwebmail;import ... -
JavaBean用户化
2004-10-05 09:05 658JavaBean开发者可以给一个Bean添加用户化器(Cust ...
相关推荐
【DOM4J编码问题彻底解决】 DOM4J是一个流行的Java XML API,它提供了灵活和强大的方式来处理XML文档。在处理XML文档时,编码问题是一个常见的挑战,特别是当涉及到读取、写入或转换XML文件时。本文主要讨论了如何...
此包有以下资源: dom4j API DOM4J 使用简介 dom4j(Version 1[1].6.1)快速入门 Matrix - 与 Java 共舞 - Dom4j 编码问题彻底解决 使用 dom4j 解析 XML
虽然这些操作改变了乱码的表现形式,但并未彻底解决问题。此时,问题的关键在于确定乱码是在读取XML时产生还是写入数据库时出现。 通过在Eclipse中打印数据,开发者确认程序内部处理并无乱码,因此确定问题出在...
jQuery 使用名为 noConflict() 的方法来解决该问题。 var jq=jQuery.noConflict(),帮助您使用自己的名称(比如 jq)来代替 $ 符号。 亲自试一试 结论 由于 jQuery 是为处理 HTML 事件而特别设计的,那么当您遵循...
jQuery1.2 API 中文版折叠展开折叠全部展开全部 英文说明 核心jQuery 核心函数 jQuery(expression,[context]) jQuery(expression,[context]) 这个函数接收一个包含 CSS 选择器的字符串,然后用这个字符串去匹配一组...