首先我们看看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();
}
}
}
转载于:https://blog.51cto.com/botao900422/1259403