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的简单问题
可以在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)
- java+dom4j操作XML
- java dom4j操作xml
- java dom4j操作xml
- java dom4j操作xml
- java dom4j操作xml
- java dom4j操作xml
- java操作xml----dom4j
- Java Dom4j操作XML
- Java DOM4J操作XML
- java : dom4j 操作 XML
- Java操作XML---DOM4J简介
- Java操作XML文件 dom4j
- Java操作XML---DOM4J简介
- java dom4j操作xml[转]
- java操作xml之dom4j
- Java操作XML---DOM4J简介
- JAVA: 使用Dom4j操作XML
- 5、java操作xml,dom4j
- Java Q_A Getting Started
- arm linux 启动流程之 进入内核
- 关于.NET Exception的重新认识
- asdfasdfasfd
- 抽象工厂(Abstract Factory)模式的Java实现[00原创]
- java+dom4j操作XML
- Linux下文件分割与合并
- 思维元素
- 异常处理 try-catch 用法
- 颐和园游记(来了可别错过)
- 存储过程
- OpenTissue编译备忘
- 常用JS汇总
- Java程序初始化顺序