您的位置:首页 > 其它

使用DOM4J修改读入的xml文档

2016-06-12 19:26 316 查看

使用DOM4J修改读入的xml文档

使用DOM4J修改读入的xml文档
概述

DOM4J修改xml文档
核心API

使用API实现对xml文档的修改
将一个Document对象写出到磁盘中

修改xml文档

概述

之前讲述的关于xml解析的话题都是围绕着怎么去操作xml文档,那么我们有一个问题,是否有方法去修改xml文档呢?回答是DOM4J同样给我们提供了修改的功能。

DOM4J修改xml文档

[b]核心API[/b]

增加

DocumentHelper.createDocument(); //增加一个xml文档

addElement(“标签名称”); //增加标签

addAttribute(“属性”,”值”); //增加属性和对应的值

addText(“文本内容”);//增加文本内容

修改

Attribute.setValue(“属性值”);//修改属性值

Element.addAttribute(“同名的属性名”,”属性值”); //修改同名的属性值

Element.setText();//修改文本内容

删除

Element.detach();//删除标签、

Attribute.detach(); //删除一个属、

[b]使用API实现对xml文档的修改[/b]

接口编程的核心就是用好其中的核心API,所以本文的其余部分将从API的使用入手进行分析。

[b]将一个Document对象写出到磁盘中[/b]

要实现修改,首先做的第一件事情就是将Document对象能够实现写出到磁盘中,因为修改xml文件,最后都要将该文件写出到磁盘中,此时该步骤就显得尤其重要。

package com.jpzhutech.xml_update;

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.Writer;

import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;
import org.junit.Test;

public class TestParseXml {

//test1函数实现的功能:将一个document对象写出到磁盘中
@Test
public void test1() throws DocumentException{

try {
//读取项目中的xml文件
Document document = new SAXReader().read("./src/contact.xml"); //将磁盘中的xml文件读取到内存中,形成document对象树

//创建一个字节流对象,通常情况下字节流输出对象使用的更多,指定文件输出的位置
FileOutputStream fileOutputStream = new FileOutputStream(new File("G:/Java/contact.xml"));

//创建写出对象
XMLWriter xmlWriter = new XMLWriter(fileOutputStream);  //采用带有输出流参数的构造器生成该写出对象
xmlWriter.write(document);

fileOutputStream.close();

} catch (IOException e) {
throw new RuntimeException(e);
}

}
}


关于将Document对象写出到磁盘中有一些小细节需要注意,下面将会详细的讲述这些细节,细节中涉及到两个问题,一个是编码问题,这是防止乱码的一种解决方案,另外一个问题是写出的格式问题,当产品上线时,采用紧凑格式输出保存,当代码用于调试等需要人看的时候,采用漂亮格式,下面内容是其代码实现。

public void test1() throws DocumentException{

try {
//读取项目中的xml文件
Document document = new SAXReader().read("./src/contact.xml"); //将磁盘中的xml文件读取到内存中,形成document对象树

//创建一个字节流对象,通常情况下字节流输出对象使用的更多,指定文件输出的位置
FileOutputStream fileOutputStream = new FileOutputStream(new File("G:/Java/contact.xml"));

/*细节一:指定输出的格式,分为紧凑的格式(删除所有的空格换行)和漂亮的格式(有空格换行),这两个文档时不同的,因为在xml中空格换行也是其内容
OutputFormat outputFormat = OutputFormat.createPrettyPrint();    //给人看的时候用该格式
OutputFormat outputFormat = OutputFormat.createCompactFormat();   //给机器看的时候用这个格式,也就是说当项目上线之后,只给机器看,所以采用该种紧凑格式
*/

/***
* 细节二:指定生成的xml文档的编码,该编码会影响xml文件保存时的编码和文档声明中的编码
*/
OutputFormat outputFormat = OutputFormat.createPrettyPrint();    //给人看的时候用该格式
outputFormat.setEncoding("utf-8");  //设置输出时的文档的编码格式,同时影响了xml文件保存时的编码和xml文档声明时encoding的编码,功能强大要多使用

//创建写出对象
XMLWriter xmlWriter = new XMLWriter(fileOutputStream,outputFormat);  //采用带有输出流参数的构造器生成该写出对象
xmlWriter.write(document);

fileOutputStream.close();

} catch (IOException e) {
throw new RuntimeException(e);
}
}


[b]修改xml文档[/b]

增加新的xml文档、标签、属性、文本

前面在讲述整个过程时,采用的将已经存在的xml文档读入然后进行修改的思路,实际上采用DOM4J可以实现创建一个还不存在的xml文档的功能。

@Test
public void test2() throws DocumentException{
try {
//创建一个xml文档
Document document = DocumentHelper.createDocument();

/**
* 接着,在此部分对文档进行修改
* 修改包括:增、删、改
* 增加:新的标签(addElement()函数)、新的属性、增加新的文档
* 修改:属性值、文本内容
* 删除:属性、标签
*/

/***
* 增加:增加新的文档、新的标签、新的属性
*/

//创建一个根标签,只能有一个根标签
Element rootElement = document.addElement("contactlist");

//在根标签下面创建多个子标签,在创建标签时只使用addElement()函数
Element addElement1 = rootElement.addElement("contact");
Element addElement = addElement1.addElement("name");
addElement1.addElement("id");
addElement1.addElement("qq");
addElement1.addElement("telephone");

Element addElement2 = rootElement.addElement("contact");
addElement2.addElement("name");
addElement2.addElement("id");
addElement2.addElement("qq");
addElement2.addElement("telephone");

//添加属性,找到对应的标签,在标签中添加属性
addElement1.addAttribute("id", "001");
addElement.addText("张三");

//最后,将修改后的内容写出到磁盘中
//创建一个字节流对象,通常情况下字节流输出对象使用的更多,指定文件输出的位置
FileOutputStream fileOutputStream = new FileOutputStream(new File("G:/Java/contact.xml"));
OutputFormat outputFormat = OutputFormat.createPrettyPrint();  //设置输出格式为漂亮格式
outputFormat.setEncoding("utf-8");  //设置编码

//创建写出对象
XMLWriter xmlWriter = new XMLWriter(fileOutputStream,outputFormat);  //采用带有输出流参数的构造器生成该写出对象
xmlWriter.write(document);

//关闭输出流对象
fileOutputStream.close();

} catch (IOException e) {
throw new RuntimeException(e);
}
}


删除标签、文本、属性及修改文本、属性

删除操作

首先获得要删除的对象

用该对象调用detach方法即可实现删除操作

修改文本或者属性采用的是覆盖的方法,对于属性,在同一个标签中不能有两个同名的属性,利用该条规则可以实现属性的修改,和增加属性的代码是一样的,只不过要增加的属性实际上属性的key本身就是存在的。对于文本的覆盖也是如此。

package com.jpzhutech.xml_update;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.Writer;

import org.dom4j.Document;
import org.dom4j.DocumentException;
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.junit.Test;

public class TestParseXml {

//test1函数实现的功能:将一个document对象写出到磁盘中,该document对象已经存在
@Test
public void test1() throws DocumentException{

try {
//读取项目中的xml文件
Document document = new SAXReader().read("./src/contact.xml"); //将磁盘中的xml文件读取到内存中,形成document对象树

//创建一个字节流对象,通常情况下字节流输出对象使用的更多,指定文件输出的位置
FileOutputStream fileOutputStream = new FileOutputStream("G:/Java/contact.xml");

/*细节一:指定输出的格式,分为紧凑的格式(删除所有的空格换行)和漂亮的格式(有空格换行),这两个文档时不同的,因为在xml中空格换行也是其内容
OutputFormat outputFormat = OutputFormat.createPrettyPrint();    //给人看的时候用该格式
OutputFormat outputFormat = OutputFormat.createCompactFormat();   //给机器看的时候用这个格式,也就是说当项目上线之后,只给机器看,所以采用该种紧凑格式
*/

/***
* 细节二:指定生成的xml文档的编码,该编码会影响xml文件保存时的编码和文档声明中的编码
*/
OutputFormat outputFormat = OutputFormat.createPrettyPrint();    //给人看的时候用该格式
outputFormat.setEncoding("utf-8");  //设置输出时的文档的编码格式,同时影响了xml文件保存时的编码和xml文档声明时encoding的编码,功能强大要多使用

//创建写出对象
XMLWriter xmlWriter = new XMLWriter(fileOutputStream,outputFormat);  //采用带有输出流参数的构造器生成该写出对象
xmlWriter.write(document);

fileOutputStream.close();

} catch (IOException e) {
throw new RuntimeException(e);
}
}

@Test
public void test2() throws DocumentException{
try {
//创建一个xml文档
Document document = DocumentHelper.createDocument();

/**
* 接着,在此部分对文档进行修改
* 修改包括:增、删、改
* 增加:新的标签(addElement()函数)、新的属性、增加新的文档
* 修改:属性值、文本内容
* 删除:属性、标签   找到对应的属性或者标签,接着使用属性对象或者标签对象删除即可,属性对象、标签对象、文本对象三者均有detach方法
*/

/***
* 增加:增加新的文档、新的标签、新的属性
*/

//创建一个根标签,只能有一个根标签
Element rootElement = document.addElement("contactlist");

//在根标签下面创建多个子标签,在创建标签时只使用addElement()函数
Element addElement1 = rootElement.addElement("contact");
addElement1.addAttribute("id", "张三");
Element addElement = addElement1.addElement("name");
Element idElement = addElement1.addElement("id");
addElement1.addElement("qq");
addElement1.addElement("telephone");

Element addElement2 = rootElement.addElement("contact");
addElement2.addElement("name");
addElement2.addElement("id");
addElement2.addElement("qq");
addElement2.addElement("telephone");

//添加属性,找到对应的标签,在标签中添加属性
Element addAttribute = addElement1.addAttribute("id", "002");
addAttribute.detach();
Element addText = addElement.addText("张三");
addText.detach();

//删除标签
idElement.getParent().detach();

//最后,将修改后的内容写出到磁盘中
//创建一个字节流对象,通常情况下字节流输出对象使用的更多,指定文件输出的位置
FileOutputStream fileOutputStream = new FileOutputStream(new File("G:/Java/contact.xml"));
OutputFormat outputFormat = OutputFormat.createPrettyPrint();  //设置输出格式为漂亮格式
outputFormat.setEncoding("utf-8");  //设置编码

//创建写出对象
XMLWriter xmlWriter = new XMLWriter(fileOutputStream,outputFormat);  //采用带有输出流参数的构造器生成该写出对象
xmlWriter.write(document);

//关闭输出流对象
fileOutputStream.close();

} catch (IOException e) {
throw new RuntimeException(e);
}
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: