首先我们看看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);
 }
 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对象来构建



一个例子

向一个已有的xml文件中添加

package ytu.botao.util;
import java.io.FileOutputStream;
import java.io.FileWriter;
import java.io.IOException;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;
/**
 * 添加xml节点信息
 *
 * @author botao
 *
 */
public class AddXmlElement {
    /**
     * 给定9个参数
     * @param id
     * @param title
     * @param keyword
     * @param kind
     * @param describe
     * @param date
     * @param url
     * @param author
     * @param piblish
     */
    public static void addXmlElement(String id, String title, String keyword,
            String kind, String describe, String date, String url,
            String author, String publisher) {
          
        // 向test.xml中添加新上传文档是信息
                try {
                    SAXReader saxReader = new SAXReader();
                    Document doc = saxReader.read("test.xml");
                    Element rooElement = doc.getRootElement();
                    // 新加节点
                    Element addElement = DocumentHelper.createElement("resourceitem");
                    Element idElement = addElement.addElement("id");
                    idElement.setText(id);
                    Element titleElement = addElement.addElement("title");
                    titleElement.setText(title);
                    Element keywordElement = addElement.addElement("keywords");
                    System.err.println("keyword" + keyword);
                    keywordElement.setText(keyword);
                    Element kindElement = addElement.addElement("kind");
                    kindElement.setText(kind);
                    Element describeElement = addElement.addElement("describe");
                    describeElement.setText(describe);
                    Element dateElement = addElement.addElement("date");
                    dateElement.setText(date);
                    Element urlElement = addElement.addElement("url");
                    urlElement.setText(url);
                    Element authorElement = addElement.addElement("author");
                    authorElement.setText(author);
                    Element publisherElement = addElement.addElement("publisher");
                    publisherElement.setText(publisher);
                    rooElement.add(addElement);
                    try {
                        //********1写入中文不会出现乱码
                        XMLWriter xmlWriter = new XMLWriter(new FileOutputStream("test.xml"), new OutputFormat().createPrettyPrint());
                        xmlWriter.write(doc);
                          
                        //**********2写入中文会出现乱码
//                      XMLWriter xmlWriter = new XMLWriter(new FileWriter("test.xml"),
//                              new OutputFormat().createPrettyPrint());
//                      xmlWriter.write(doc);
//                      xmlWriter.close();
                    } catch (IOException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                } catch (DocumentException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
          
    }
}