java+dom4j操作XML

4 篇文章 0 订阅

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

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对象,用于指定显示和编码方式。


 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
使用dom4j操作xml需要以下步骤: 1. 导入dom4j相关的jar包。 2. 创建SAXReader对象,用于读取xml文件。 3. 调用SAXReader对象的read方法读取xml文件,生成Document对象。 4. 获取根元素,通过Document对象的getRootElement方法获取根元素。 5. 获取子元素,通过Element对象的element方法获取子元素。 6. 获取属性值,通过Element对象的attributeValue方法获取属性值。 7. 获取文本内容,通过Element对象的getText方法获取文本内容。 8. 修改xml,通过Element对象的addAttribute、addElement和setText方法修改xml内容。 9. 保存xml,通过XMLWriter对象将修改后的xml写入文件中。 以下是一个使用dom4j操作xml的示例代码: ```java import java.io.File; import java.io.FileWriter; import java.util.List; import org.dom4j.Attribute; import org.dom4j.Document; import org.dom4j.Element; import org.dom4j.io.OutputFormat; import org.dom4j.io.SAXReader; import org.dom4j.io.XMLWriter; public class Dom4jDemo { public static void main(String[] args) throws Exception { // 读取xml文件 SAXReader reader = new SAXReader(); Document document = reader.read(new File("test.xml")); // 获取根元素 Element root = document.getRootElement(); // 获取子元素 List<Element> childElements = root.elements(); for (Element child : childElements) { // 获取属性值 Attribute idAttr = child.attribute("id"); String id = idAttr.getValue(); System.out.println("id:" + id); // 获取文本内容 String name = child.elementText("name"); System.out.println("name:" + name); // 修改xml child.addAttribute("newAttr", "newAttrValue"); child.addElement("newElement").setText("newElementText"); child.element("name").setText("newName"); } // 保存xml OutputFormat format = OutputFormat.createPrettyPrint(); format.setEncoding("UTF-8"); XMLWriter writer = new XMLWriter(new FileWriter("test.xml"), format); writer.write(document); writer.close(); } } ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值