dom4j讀寫xml檔案以及遇到的亂碼解決辦法
這是碰到亂碼問題之後再csdn上看到的:
xml亂碼的問題在於編碼集的衝突。
/*//document物件在記憶體中是以"UTF-8"編碼形式存在,用FileWriter將document物件以字元流的形式寫入xml文件預設是用本地碼錶"gb2312"編碼
* 亂碼問題總結:
* 1.用字元流向檔案寫入資料要考慮亂碼問題,而用位元組流就不必考慮亂碼問題
* 用字元流向檔案寫入資料預設使用本地碼錶即"gb2312"
* 2.任何物件讀入記憶體都是以"UTF-8"編碼的形式存在
* 預設情況下XMLWriter的write方法是以"UTF-8"的編碼形式將記憶體中的document物件傳給FileWriter,所以要想不發生亂碼問題,
* 就要使用包裝流OutputStreamWriter並給定寫入檔案時所使用的編碼表,或者使用OutputFormat的setEncoding方法指定傳給
* 流物件時所使用的編碼格式。
* */
}
book.xml
<?xml version="1.0" encoding="UTF-8"?>
<書架>
<書>
<書名>Java就業基礎教程</書名>
<作者>張孝祥</作者>
<售價>48元</售價>
<售價>58元</售價>
</書>
<書>
<書名>JavaScript網頁開發</書名>
<作者>黎活明</作者>
<售價>46元</售價>
</書>
</書架>
Dom4j.java
package yyy.dom4j;
import java.io.File;
import java.io.FileOutputStream;
import java.io.OutputStreamWriter;
import java.util.List;
import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.Node;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;
import org.junit.Test;
public class Dom4j {
private File file = new File("src/book.xml");
//遍歷xml文件
@Test
public void testList() throws Exception{
SAXReader reader = new SAXReader();
Document document = reader.read(file);
Element root = document.getRootElement();
list(root);
}
public void list(Element element){
System.out.println(element.getName());
List<Node> nodes = element.elements();
//System.out.println(nodes.size());
for(Node node : nodes){
if(node instanceof Element){
list((Element) node);
}
}
}
//讀取某個節點的值
@Test
public void read() throws Exception{
SAXReader reader = new SAXReader();
Document document = reader.read(file);
Element root = document.getRootElement();
Element price = root.element("書").element("作者");
String value = price.getText();
System.out.println(value);
}
//新增某個節點
@Test
public void add() throws Exception{
SAXReader reader = new SAXReader();
Document document = reader.read(file);
Element price = DocumentHelper.createElement("售價"); //建立新的節點
price.setText("44元"); //設定節點值
Element root = document.getRootElement();
root.element("書").add(price); //新增節點
//將記憶體中的document物件重新寫入xml文件 特別要注意亂碼問題
//方法1:使用OutputStreamWriter設定寫入文件時所使用的編碼表
OutputStreamWriter out = new OutputStreamWriter(new FileOutputStream(file),"utf-8");
document.write(out);
out.close();
/*//方法2:
OutputFormat format = OutputFormat.createPrettyPrint();
format.setEncoding("gb2312");
XMLWriter writer = new XMLWriter(new FileWriter(file),format);
writer.write(document);
writer.close();*/
/*//方法3:
OutputFormat format = OutputFormat.createPrettyPrint();
XMLWriter writer = new XMLWriter(new OutputStreamWriter(new FileOutputStream(file),"utf-8"),format);
writer.write(document);
writer.close();*/
/*//方法4:
OutputFormat format = OutputFormat.createPrettyPrint();
format.setEncoding("gb2312"); //源文件用"gb2312"編碼,既不改變源文件的編碼格式,又不能有亂碼
XMLWriter writer = new XMLWriter(new FileOutputStream(file),format);
writer.write(document);
writer.close();*/
/*//document物件在記憶體中是以"UTF-8"編碼形式存在,用FileWriter將document物件以字元流的形式寫入xml文件預設是用本地碼錶"gb2312"編碼
* 亂碼問題總結:
* 1.用字元流向檔案寫入資料要考慮亂碼問題,而用位元組流就不必考慮亂碼問題
* 用字元流向檔案寫入資料預設使用本地碼錶即"gb2312"
* 2.任何物件讀入記憶體都是以"UTF-8"編碼的形式存在
* 預設情況下XMLWriter的write方法是以"UTF-8"的編碼形式將記憶體中的document物件傳給FileWriter,所以要想不發生亂碼問題,
* 就要使用包裝流OutputStreamWriter並給定寫入檔案時所使用的編碼表,或者使用OutputFormat的setEncoding方法指定傳給
* 流物件時所使用的編碼格式。
* */
}
//向指定位置新增節點
@Test
public void add2() throws Exception{
SAXReader reader = new SAXReader();
Document document = reader.read(file);
Element root = document.getRootElement();
Element price = DocumentHelper.createElement("售價");
price.setText("48元");
List list = root.element("書").elements();
list.add(2,price);
OutputFormat format = OutputFormat.createPrettyPrint();
XMLWriter writer = new XMLWriter(new FileOutputStream(file),format);
writer.write(document);
writer.close();
}
//刪除某個節點
@Test
public void delete() throws Exception{
SAXReader reader = new SAXReader();
Document document = reader.read(file);
Element root = document.getRootElement();
Element price = root.element("書").element("售價");
price.getParent().remove(price);
OutputFormat format = OutputFormat.createPrettyPrint();
XMLWriter writer = new XMLWriter(new FileOutputStream(file),format);
writer.write(document);
writer.close();
}
//更改某個節點的內容
@Test
public void update() throws Exception{
SAXReader reader = new SAXReader();
Document document = reader.read(file);
Element root = document.getRootElement();
Element price = root.element("書").element("售價");
price.setText("58元");
OutputFormat format = OutputFormat.createPrettyPrint();
XMLWriter writer = new XMLWriter(new FileOutputStream(file),format);
writer.write(document);
writer.close();
}
}