首先咱們看看dom4j是如何實現編碼處理的java
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對象來構建dom
一個例子ide
向一個已有的xml文件中添加this
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(); } } }