名扬数据:dom4j解析及写入XML文档时的乱码问题

book.xml

  1. <?xml version="1.0" encoding="UTF-8"?> 

  2.  

  3. <书架> 

  4.   <> 

  5.     <书名>Java就业基础教程</书名>   

  6.     <作者>张孝祥</作者>   

  7.     <售价>48元</售价> 

  8.     <售价>58元</售价> 

  9.   </>   

  10.   <> 

  11.     <书名>JavaScript网页开发</书名>   

  12.     <作者>黎活明</作者>   

  13.     <售价>46元</售价> 

  14.   </> 

  15. </书架> 

Dom4j.java

  1. package yyy.dom4j;  

  2.  

  3. import java.io.File;  

  4. import java.io.FileOutputStream;  

  5. import java.io.OutputStreamWriter;  

  6. import java.util.List;  

  7.  

  8. import org.dom4j.Document;  

  9. import org.dom4j.DocumentHelper;  

  10. import org.dom4j.Element;  

  11. import org.dom4j.Node;  

  12. import org.dom4j.io.OutputFormat;  

  13. import org.dom4j.io.SAXReader;  

  14. import org.dom4j.io.XMLWriter;  

  15. import org.junit.Test;  

  16.  

  17.    

  18.  

  19. public class Dom4j {  

  20.    

  21.  private File file = new File("src/book.xml");  

  22.  //遍历xml文档  

  23.  @Test 

  24.  public void testList() throws Exception{  

  25.   SAXReader reader = new SAXReader();  

  26.   Document document = reader.read(file);  

  27.   Element root = document.getRootElement();  

  28.   list(root);  

  29.  }  

  30.  public void list(Element element){  

  31.   System.out.println(element.getName());  

  32.   List<Node> nodes = element.elements();  

  33.   //System.out.println(nodes.size());  

  34.   for(Node node : nodes){  

  35.    if(node instanceof Element){  

  36.     list((Element) node);  

  37.    }  

  38.   }  

  39.  }  

  40.    

  41.  //读取某个节点的值  

  42.  @Test 

  43.  public void read() throws Exception{  

  44.   SAXReader reader = new SAXReader();  

  45.   Document document = reader.read(file);  

  46.   Element root = document.getRootElement();  

  47.   Element price = root.element("书").element("作者");  

  48.   String value = price.getText();  

  49.   System.out.println(value);  

  50.  }  

  51.    

  52.  //添加某个节点  

  53.  @Test 

  54.  public void add() throws Exception{  

  55.   SAXReader reader = new SAXReader();  

  56.   Document document = reader.read(file);  

  57.     

  58.   Element price = DocumentHelper.createElement("售价"); //创建新的节点  

  59.   price.setText("44元");  //设置节点值  

  60.     

  61.   Element root = document.getRootElement();  

  62.   root.element("书").add(price);  //添加节点  

  63.     

  64.   //将内存中的document对象重新写入xml文档   特别要注意乱码问题  

  65.  

  66.   //方法1:使用OutputStreamWriter设置写入文档时所使用的编码表  

  67.   OutputStreamWriter out = new OutputStreamWriter(new FileOutputStream(file),"utf-8");  

  68.   document.write(out);  

  69.   out.close();  

  70.     

  71.   /*//方法2:  

  72.   OutputFormat format = OutputFormat.createPrettyPrint();  

  73.   format.setEncoding("gb2312");  

  74.   XMLWriter writer = new XMLWriter(new FileWriter(file),format);  

  75.   writer.write(document);  

  76.   writer.close();*/ 

  77.     

  78.      /*//方法3:  

  79.   OutputFormat format = OutputFormat.createPrettyPrint();  

  80.   XMLWriter writer = new XMLWriter(new OutputStreamWriter(new FileOutputStream(file),"utf-8"),format);  

  81.   writer.write(document);  

  82.   writer.close();*/ 

  83.     

  84.   /*//方法4:  

  85.   OutputFormat format = OutputFormat.createPrettyPrint();  

  86.   format.setEncoding("gb2312");  //源文档用"gb2312"编码,既不改变源文档的编码格式,又不能有乱码  

  87.   XMLWriter writer = new XMLWriter(new FileOutputStream(file),format);  

  88.   writer.write(document);  

  89.   writer.close();*/ 

  90.     

  91.   /*//document对象在内存中是以"UTF-8"编码形式存在,用FileWriter将document对象以字符流的形式写入xml文档默认是用本地码表"gb2312"编码  

  92.    * 乱码问题总结:  

  93.    * 1.用字符流向文件写入数据要考虑乱码问题,而用字节流就不必考虑乱码问题  

  94.    *   用字符流向文件写入数据默认使用本地码表即"gb2312"  

  95.    * 2.任何对象读入内存都是以"UTF-8"编码的形式存在  

  96.    * 默认情况下XMLWriter的write方法是以"UTF-8"的编码形式将内存中的document对象传给FileWriter,所以要想不发生乱码问题,  

  97.    * 就要使用包装流OutputStreamWriter并给定写入文件时所使用的编码表,或者使用OutputFormat的setEncoding方法指定传给  

  98.    * 流对象时所使用的编码格式。  

  99.    * */ 

  100.  }  

  101.    

  102.  //向指定位置添加节点  

  103.  @Test 

  104.  public void add2() throws Exception{  

  105.   SAXReader reader = new SAXReader();  

  106.   Document document = reader.read(file);  

  107.   Element root = document.getRootElement();  

  108.   Element price = DocumentHelper.createElement("售价");  

  109.   price.setText("48元");  

  110.   List list = root.element("书").elements();  

  111.   list.add(2,price);  

  112.     

  113.   OutputFormat format = OutputFormat.createPrettyPrint();  

  114.   XMLWriter writer = new XMLWriter(new FileOutputStream(file),format);  

  115.   writer.write(document);  

  116.   writer.close();  

  117.  }  

  118.    

  119.  //删除某个节点  

  120.  @Test 

  121.  public void delete() throws Exception{  

  122.   SAXReader reader = new SAXReader();  

  123.   Document document = reader.read(file);  

  124.   Element root = document.getRootElement();  

  125.   Element price = root.element("书").element("售价");  

  126.   price.getParent().remove(price);  

  127.     

  128.   OutputFormat format = OutputFormat.createPrettyPrint();  

  129.   XMLWriter writer = new XMLWriter(new FileOutputStream(file),format);  

  130.   writer.write(document);  

  131.   writer.close();  

  132.  }  

  133.    

  134.  //更改某个节点的内容  

  135.  @Test 

  136.  public void update() throws Exception{  

  137.   SAXReader reader = new SAXReader();  

  138.   Document document = reader.read(file);  

  139.   Element root = document.getRootElement();  

  140.   Element price = root.element("书").element("售价");  

  141.   price.setText("58元");  

  142.     

  143.   OutputFormat format = OutputFormat.createPrettyPrint();  

  144.   XMLWriter writer = new XMLWriter(new FileOutputStream(file),format);  

  145.   writer.write(document);  

  146.   writer.close();  

  147.  }