java+dom4j操作XML

来源:互联网 发布:淘宝爱他美官方旗舰店 编辑:程序博客网 时间:2024/04/29 03:05

package _test;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.OutputStreamWriter;
import java.io.Writer;
import java.util.Iterator;
import java.util.List;

import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;

class VolumePlan {
 private String beginTime;

 private String endTime;

 private int volume;

 public String getBeginTime() {
  return beginTime;
 }

 public void setBeginTime(String beginTime) {
  this.beginTime = beginTime;
 }

 public String getEndTime() {
  return endTime;
 }

 public void setEndTime(String endTime) {
  this.endTime = endTime;
 }

 public int getVolume() {
  return volume;
 }

 public void setVolume(int volume) {
  this.volume = volume;
 }
}

public class TestXML {
 public static void writeXML(String filename, Document doc) {
  try {
   /** 格式化输出,类型IE浏览一样 */
   OutputFormat format = OutputFormat.createPrettyPrint();// 这句指定了格式化的方式为缩进式,则非紧凑式
   /** 指定XML编码 */
   //format.setEncoding("UTF-8");//默认为UTF-8,可不指定。

   // 注意:此处用FileOutputStream而非FileWriter,可解决存入文件非用UTF8编码而用ANSI编码的问题
   Writer writer = new OutputStreamWriter(new FileOutputStream(
     filename), "UTF-8");
   XMLWriter output = new XMLWriter(writer, format);
   output.write(doc);
   output.close();
  } catch (Exception e) {
   e.printStackTrace();
  }
 }

 public static Document readXML(String filename) {
  SAXReader saxReader = new SAXReader();
  try {
   // 注意:此处用FileInputStream而非FileReader(new
   // File(filename)),用UTF8编码保存文件修改后中文乱码的问题
   Document doc = saxReader.read(new FileInputStream(filename),
     "UTF-8");
   return doc;
  } catch (Exception e) {
   e.printStackTrace();
   return null;
  }
 }

 public static Document createTimeVolumeXML(VolumePlan vol) {
  Document doc = DocumentHelper.createDocument();
  doc.addComment("这是一个音量计划表");
  Element elPlan = doc.addElement("根结点");
  Element elTimeSpan = elPlan.addElement("timespan");
  Element elBegintime = elTimeSpan.addElement("begintime");
  elBegintime.setText(vol.getBeginTime());
  Element elEndtime = elTimeSpan.addElement("endtime");
  elEndtime.setText(vol.getEndTime());
  Element elVolume = elTimeSpan.addElement("volume");
  elVolume.setText(Integer.toString(vol.getVolume()));
  return doc;
 }

 public static Document addTimeVolume2XML(Document doc, VolumePlan vol) {
  Element rootNode = (Element) doc.selectSingleNode("根结点");
  Element elTimeSpan = rootNode.addElement("timespan");
  elTimeSpan.addComment("这是一个新加的节点");
  Element elBegintime = elTimeSpan.addElement("begintime");
  elBegintime.setText(vol.getBeginTime());
  Element elEndtime = elTimeSpan.addElement("endtime");
  elEndtime.setText(vol.getEndTime());
  Element elVolume = elTimeSpan.addElement("volume");
  elVolume.setText(Integer.toString(vol.getVolume()));
  return doc;
 }

 public static Document editTimeVolume2XML(Document doc, VolumePlan orgVol,
   VolumePlan newVol) {
  String begintime = orgVol.getBeginTime();
  List nodeList = doc.selectNodes("根结点/timespan/begintime");
  Iterator iterator = nodeList.iterator();
  while (iterator.hasNext()) {
   Element node = (Element) iterator.next();
   if (begintime.equals(node.getText())) {
    node.getParent().addComment("这个节点被修改过");
    node.setText(newVol.getBeginTime());
    node.getParent().selectSingleNode("endtime").setText(
      newVol.getEndTime());
    node.getParent().selectSingleNode("volume").setText(
      Integer.toString(newVol.getVolume()));
   }
  }
  return doc;
 }

 public static Document delTimeVolume2XML(Document doc, VolumePlan vol) {
  String begintime = vol.getBeginTime();
  List nodeList = doc.selectNodes("根结点/timespan/begintime");
  Iterator iterator = nodeList.iterator();
  while (iterator.hasNext()) {
   Element node = (Element) iterator.next();
   if (begintime.equals(node.getText())) {
    ((Element) doc.selectSingleNode("根结点"))
      .remove(node.getParent());
    break;
   }
  }
  return doc;
 }

 public static void main(String[] args) {
  VolumePlan vol = new VolumePlan();
  vol.setBeginTime("09:00:00");
  vol.setEndTime("10:00:00");
  vol.setVolume(100);
  Document doc = createTimeVolumeXML(vol);
  VolumePlan volNew = new VolumePlan();
  volNew.setBeginTime("10:00:00");
  volNew.setEndTime("11:00:00");
  volNew.setVolume(50);
  doc = addTimeVolume2XML(doc, volNew);
  VolumePlan volUpdate = new VolumePlan();
  volUpdate.setBeginTime("10:00:00");
  volUpdate.setEndTime("11:00:00");
  volUpdate.setVolume(0);
  doc = editTimeVolume2XML(doc, volNew, volUpdate);
  doc = delTimeVolume2XML(doc, vol);
  writeXML("d://volumeplan.xml", doc);
  Document newDoc = readXML("d://volumeplan.xml");
  newDoc = addTimeVolume2XML(newDoc, vol);
  newDoc = editTimeVolume2XML(newDoc, volUpdate, volNew);
  newDoc = delTimeVolume2XML(newDoc, volNew);
  writeXML("d://volumeplan.xml", newDoc);
 }
}

中文问题参考文章1(http://blog.bc-cn.net/user14/70447/archives/2007/6720.shtml)

  dom4j的简单问题

[ kingyor 发表于 2007-7-8 22:11:00 ]
 

可以在http://dom4j.org下载,最好下载ZIP包(找不到就问我要吧),里面有除了dom4j-1.6.1.jar之外还有jaxen-1.1-beta-6.jar等包。

 一个简单例子

import java.io.File;  
import java.io.*;  
import java.util.*;  
import java.util.List;      
import org.dom4j.Attribute;      
import org.dom4j.Document;      
import org.dom4j.DocumentHelper;      
import org.dom4j.Element;      
import org.dom4j.io.OutputFormat;      
import org.dom4j.io.SAXReader;      
import org.dom4j.io.XMLWriter;  
import org.dom4j.DocumentException;

public class test{

public void createBookInfor(String filename,String content){
       Calendar   rightNow   =   Calendar.getInstance();  
        Date   thisTime   =   rightNow.getTime(); 
       Document document = DocumentHelper.createDocument();
       document.addComment("Generated by: http://www.chinascript.com/ $Revision: 1.0 $");//添加注释
       Element chapterElement = document.addElement("chapter");//建立名为chapter的根节点
       Element pageElement = chapterElement.addElement("page");//建立page节点
       pageElement.addAttribute("id","1");//添加page的属性
       Element timeElement = pageElement.addElement("time");//建立time节点
       timeElement.setText(thisTime.toString());//填加当前时间
       Element contentElement = pageElement.addElement("content");//建立content节点
       contentElement.setText(content);//添加内容
       try   {  
               XMLWriter output = null;  
              /**   格式化输出,类型IE浏览一样   */  
              OutputFormat   format   =   OutputFormat.createPrettyPrint();  
              /**   指定XML字符集编码   */  
              format.setEncoding("UTF-8");  
              output   =   new   XMLWriter(new   FileOutputStream(new   File(filename)),   format); 

             /*注意:FileOutputStream和FileWriter*/
              output.write(document);  
              output.close(); 
          }  
          catch   (Exception   ex)   {  
              ex.printStackTrace();  
          }  
       }

}

另外,在XML中增加节点:

try   { 
              SAXReader   saxReader   =   new   SAXReader();  
              Document   document   =   saxReader.read(new   FileReader(new   File(filename)));
              List parent = document.selectNodes("/chapter");// 要插入节点的父节点
              Iterator   iter   =   parent.iterator();
              if(iter.hasNext()){
               Element chapterElement   =   (Element)   iter.next();
               Element pageElement = chapterElement.addElement("page");
               pageElement.addAttribute("id","2");
               Element timeElement = pageElement.addElement("time");
               timeElement.setText(thisTime.toString());
               Element contentElement = pageElement.addElement("content");
               contentElement.setText(content);
               }

catch.........

修改:跟插入差不多。

list = document.selectNodes("//chapter" );    
 iter=list.iterator();   
while(iter.hasNext()){   
    Element element=(Element)iter.next();    
  Iterator iterator=element.elementIterator("content");
     while(iterator.hasNext()){  
        Element contentElement=(Element)iterator.next();  
        if(contentElement.getText().equals("XXXXXXXXXXX"))    
       contentElement.setText("要修改的内容");     } }
问题:前面建立的是一个UTF-8的XML文档,并且能够显示中文。但如果修改和插入的话,中文就会出现乱码。
把有中文UTF-8编码的文件再用UTF-8进行存储之后就会出现乱码,同样把含有UTF-8和GBK等编码的中文一起存储也会出现乱码,
所以中文是个很头痛的问题。

中文问题参考文章2(http://publishblog.blogdriver.com/blog/tb.b?diaryID=501763 ):

dom4j的utf-8解决方法- -

                                      

 

读xml文件时:

     不要以为你的xml文件写明encoding="utf-8",它就会聪明的帮你用utf-8读哦,必须这样写。

 document = reader.read(new FileInputStream(filename), "utf-8");

写xml文件的时候,不要自己创建Writer,让XmlWriter去根据你的form的encoding创建吧。

   OutputFormat form = OutputFormat.createPrettyPrint();
   form.setEncoding("utf-8"); 
   OutputStream fos = new FileOutputStream(filename);    
   XMLWriter output = new XMLWriter(fos, form);

可以看到,其实Dom4j对utf-8的支持是很好的,这个也是得益于java新版本对utf-8的支持。在它IO的Reader和Writer类中,都提供了方便指定encoding的方法。

所以,如果以后自己对文件操作,需要涉及到文本的encoding操作,尽量使用Reader和Writer类,而不是File或者自己去操作Stream,除非是需要处理二机制的文件。

 

- 作者: AndyYehoo 2005年01月16日, 星期日 15:42

 

格式化输出问题参见(http://www.cnblogs.com/myqiao/archive/2006/12/10/588226.html)

用Dom4j解析XML及中文问题(三)
5.格式化输出和指定编码
 
默认的输出方式为紧凑方式,默认编码为UTF-8,但对于我们的应用而言,一般都要用到中文,并且希望显示时按自动缩进的方式的显示,这就需用到OutputFormat类。
 

 
   
    /**
     * 格式化XML文档,并解决中文问题
     * @param filename
     * @return
     */
    public int formatXMLFile(String filename){
       int returnValue = 0;
       try{
           SAXReader saxReader = new SAXReader();
           Document document = saxReader.read(new File(filename));
           XMLWriter writer = null;
           /** 格式化输出,类型IE浏览一样 */
           OutputFormat format = OutputFormat.createPrettyPrint();
           /** 指定XML编码 */
           format.setEncoding("GBK");
           writer= new XMLWriter(new FileWriter(new File(filename)),format);
           writer.write(document);
           writer.close();     
           /** 执行成功,需返回1 */
           returnValue = 1;    
       }catch(Exception ex){
           ex.printStackTrace();
       }
       return returnValue;
    }

 
说明:
 
OutputFormat format = OutputFormat.createPrettyPrint();
这句指定了格式化的方式为缩进式,则非紧凑式。
 
format.setEncoding("GBK");
指定编码为GBK。
 
XMLWriter writer = new XMLWriter(new FileWriter(new File(filename)),format);
这与前面两个方法相比,多加了一个OutputFormat对象,用于指定显示和编码方式。


 

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 和老婆离婚了我的心好痛怎么办 4s店不给退定金怎么办 教你闪腰了后该怎么办 coolpad酷派手机开不了机怎么办 苹果5s黑屏开不了机怎么办 苹果4s的屏坏了怎么办 苹果6手机充电口接触不良怎么办 5s用久了卡顿怎么办 孕妇血糖高怎么办什么方法降最好 脚砸了肿了紫了怎么办 我想在淘宝上卖东西该怎么办 苹果手机4s开不了机怎么办 冒险岛s前出2条怎么办 狗狗又吐又拉血怎么办 小孩上网成瘾怎么办父母要怎么做 一只眼睛大一只眼睛小怎么办 带近视镜时间长了眼睛变形怎么办 联通卡2g换4g卡怎么办 上火牙疼怎么办教你立刻止疼 吃热的凉的牙疼怎么办 我买的股票退市了怎么办 如果起诉离婚另一方不出庭怎么办 10个月宝宝还没长牙怎么办 超敏c反应蛋白>5怎么办 怀孕才两个月肚子就大了怎么办 腰椎间盘突出腿疼厉害怎么办 打了促排卵针不排卵怎么办 孕34周隐血1十是怎么办 窦性心动过缓伴不齐怎么办 09年买的万科b怎么办 苹果5s手机打不开机怎么办 剖腹产后一年半后意外怀孕怎么办 考驾照挂了5次了怎么办 怀孕咳嗽一个月了好不了怎么办 孕妇餐后2小时血糖高怎么办 我想开网店但我不懂该怎么办 新开的淘宝店没生意怎么办 做肝胆b超喝了水怎么办 红米1s刷机失败怎么办 红米3x手机太卡怎么办 红米2a线刷失败怎么办