使用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); } } }
相关文章推荐
- 项目经验教训总结
- hive脚本出现Error: java.lang.RuntimeException: Error in configuring object和Caused by: java.lang.IndexOutOfBoundsException: Index: 9, Size: 9
- MySQL Order by 语句用法与优化详解
- 漫话机器学习大数据那些事儿
- WordPress日记——集成markdown
- 百家号将于16号上线:自媒体人得到哪些启示?
- (转载)NSUserDefaults 保存数据
- 【一天一道LeetCode】#90. Subsets II
- 【一天一道LeetCode】#90. Subsets II
- UWP VirtualizedVariableSizedGridView 支持可虚拟化可变大小Item的View(一)
- 《2016互联网趋势报告》解读(一)
- mysql排序order by新发现
- 数学(错排):BZOJ 4517: [Sdoi2016]排列计数
- Javaworkers团队第五周项目总结
- 月月月月月月月月
- [javaEE] response实现图片下载
- windows程序设计(2)---窗口的创建
- Qt浅谈之二十七进程间通信之QtDBus
- Two Sum
- Activity生命周期、启动方式及常见Activity