Dom4J中,给一个已存在的节点添加子节点的方法有两种:

通过DocumentFactory得到Element然后通过父节点的add(Element elem)方法添加,

通过Element ielem= Element.addElement(String QName);方法来添加:

public static void DocumentTest(){

org.dom4j.DocumentFactory DocumentFactory = new org.dom4j.DocumentFactory();

org.dom4j.Element root = DocumentFactory.createElement("Books");

Element book=DocumentFactory.createElement("Book");

book.setText("The Road Ahead");

for(int i=0;i<10;i++){

book.addAttribute("ISBN", "ITCP:0WESAS"+i);

root.add(book);

//root.add((Element)book.clone());

}

System.out.println(root.asXML());

}

public static void DocumentTest2(){

org.dom4j.DocumentFactory DocumentFactory = new org.dom4j.DocumentFactory();

org.dom4j.Element root = DocumentFactory.createElement("Books");

for(int i=0;i<10;i++){

Element book=null;

book=root.addElement("book");

book.setText("The Road Ahead");

book.addAttribute("ISBN", "ITCP:0WESAS"+i);

//root.add(book);

}

System.out.println(root.asXML());

}

public static void main(String[] args){

DocumentTest();

}

两种方法都是非常经典的方法,但是执行DocumentTest()方法,会出现org.dom4j.IllegalAddException 异常,要解决这个异常,也很容易,我们可以使用类Element的clone()方法(继承自Object类)得到该Element的一个副本,副本的含义,是:

要同时使对于任何对象 x,表达式:

x.clone() != x

为 true,表达式:

x.clone().getClass() == x.getClass()

也为 true,但这些并非必须要满足的要求。一般情况下:

x.clone().equals(x)

为 true,但这并非必须要满足的要求。

成立。

Dom4j 中,在给一个元素添加

所有,就业务需要来说,用两种方式都是可以的,但是,他们的执行效率一样吗?

public static int index=10;

public static long DocumentTest(){

//DefaultElement df=new DefaultElement();

java.util.Date time1=new java.util.Date();

org.dom4j.DocumentFactory DocumentFactory = new org.dom4j.DocumentFactory();

org.dom4j.Element root = DocumentFactory.createElement("Books");

Element book=DocumentFactory.createElement("Book");

book.setText("The Road Ahead");

for(int i=0;i<index;i++){

book.addAttribute("ISBN", "ITCP:0WESAS"+i);

root.add((Element)book.clone());

}

java.util.Date time2=new java.util.Date();

System.out.println("方法一执行时间"+(time2.getTime()-time1.getTime())+"ms");

return time2.getTime()-time1.getTime();

//System.out.println(root.asXML());

}

public static long DocumentTest2(){

org.dom4j.DocumentFactory DocumentFactory = new org.dom4j.DocumentFactory();

java.util.Date time1=new java.util.Date();

org.dom4j.Element root = DocumentFactory.createElement("Books");

for(int i=0;i<index;i++){

Element book=null;

book=root.addElement("book");

book.setText("The Road Ahead");

book.addAttribute("ISBN", "ITCP:0WESAS"+i);

//root.add(book);

}

java.util.Date time2=new java.util.Date();

System.out.println("方法二执行时间"+(time2.getTime()-time1.getTime())+"ms");

return time2.getTime()-time1.getTime();

//System.out.println(root.asXML());

}

public static void main(String[] args){

index=10;

for(index=10;index<=100000;index=index*10){

System.out.println("节点大小:"+index);

DocumentTest();

DocumentTest2();

//double per=DocumentTest()/DocumentTest2();

//System.out.println("时间对比:"+per);

;

//DocumentTest2();

}

}

我们通过上述代码来检查一下执行时间,运行结果如下:

节点大小:10

方法一执行时间33ms

方法二执行时间0ms

节点大小:100

方法一执行时间0ms

方法二执行时间0ms

节点大小:1000

方法一执行时间0ms

方法二执行时间0ms

节点大小:10000

方法一执行时间15ms

方法二执行时间63ms

节点大小:100000

方法一执行时间265ms

方法二执行时间327ms

两个方法的内存开销并没用本质区别,都需要创建相应数量的对象,但是,在节点数较少的情况下,时间开销相差非常可观,在节点数比较多的情况下,方法一时间开销也始终优于方法二。

转载于:https://www.cnblogs.com/MicroGoogle/archive/2011/12/13/2286616.html

Dom4J两种节点添加方法比较相关推荐

  1. 史上最容易理解————GET和POST两种基本请求方法的区别

    GET和POST两种基本请求方法的区别 GET和POST是HTTP请求的两种基本方法,要说它们的区别,接触过WEB开发的人都能说出一二. 最直观的区别就是GET把参数包含在URL中,POST通过req ...

  2. js两种拼接字符串方法

    js两种拼接字符串方法 function(msgArr) {//参数为一个数组,每一个对象为图片id和图片地址var len = msgArr.length;//第一种拼接方式,直接用"+& ...

  3. R中两种常用并行方法——2. snowfall

    上一篇博客(R中两种常用并行方法--1. parallel)中已经介绍了R中常见的一种并行包:parallel,其有着简单便捷等优势,其实缺点也是非常明显,就是很不稳定.很多时候我们将大量的计算任务挂 ...

  4. PDF怎么编辑修改内容?分享两种编辑修改方法

    PDF文件怎么编辑修改内容呢?PDF格式的文件是大家在工作中经常会使用到的,可以用来发送文件.阅读文件或者是保存文件.相信大家在阅读使用的时候,肯定有过需要编辑修改文件内容的需求,因为当我们发现文件中 ...

  5. 两种 HTTP 请求方法

    两种 HTTP 请求方法:GET 和 POST 在客户机和服务器之间进行请求-响应时,两种最常被用到的方法是:GET 和 POST. GET - 从指定的资源请求数据. POST - 向指定的资源提交 ...

  6. matlab 遍历每个像素点,Mat中两种像素遍历方法比较

    小白,入门中,不足其指正.刚刚接触opencv,从一个Matlab风格的编程环境突然跳转到C++,实在有些不适.单就pixels scanning花了好长时间研究.opencv-tutorials给出 ...

  7. Hbase表两种数据备份方法-导入和导出示例

    Hbase表两种数据备份方法-导入和导出示例 本文将提供两种备份方法 -- 1) 基于Hbase提供的类对hbase中某张表进行备份 2) 基于Hbase snapshot数据快速备份方法 场合:由于 ...

  8. 在iPhone或iPad上设置闹钟的两种最快方法

    If you often create or toggle alarms on your iPhone or iPad, there are two quick ways to do it witho ...

  9. GET和POST两种基本请求方法的区别

    GET和POST两种基本请求方法的区别 回退 回退时无害 会再次提交请求 记录 URL可被记录, 用于再访问 不可以 缓存 主动缓存 可手动设置 编码方式 只进行url编码 多种编码方式 参数长度 有 ...

最新文章

  1. asp.net分页控件使用详解【附实例下载】
  2. C#中如何将光标定位在某个控件中?
  3. Acwing第 6 场周赛【未完结】
  4. Linux Diff命令用法
  5. 79. Word Search 单词搜索
  6. java json返回null_java-JSON jsonObject.optString()返回字符串“ null”
  7. Atitit 演讲常用肢体语言与手势总结 目录 1. 原则 ,哑语一样,手势不只是补充。。。 1 2. 比拟实际物体与抽象物体 1 2.1. 三个实用的手势: 1 2.2. (五)、演讲中忌讳的动作
  8. 苹果平板爱思助手检验安兔兔
  9. 关于C#GB2312编码问题
  10. 苹果电脑表格取消自动计算机,苹果电脑excel序列被隐藏怎么办
  11. 图片边框变圆圈html,css如何设置边框的圆角样式?border-radius属性设置圆角样式(图 文)...
  12. ASP.NET中,HiddenField隐藏控件的用法
  13. 怎么用计算机打出黑人,电脑上怎么打法文
  14. python图中图_【python】matplotlib数据可视化(7)——图中图
  15. web上传图片到七牛云服务器
  16. 计算机网络安全漫画图片,安全教育漫画图片
  17. 当Mac电脑遇到ANDROID_NDK_HOME not defined...报错
  18. 上升了百分之几怎么算_上涨百分之多少怎么算
  19. TTL肖特基触发器是什么?
  20. 安装(解密)win10 10074 esd 更新 10162 esd

热门文章

  1. JZOJ 5266. number
  2. html中插人视频教程,HTML中插入视频并兼容所有浏览器
  3. 世界地图20亿像素_高通骁龙690 5G平台发布,支持1.92亿像素性能提升20%
  4. [转载]出了国才明白的10件事~(MITBBS ZT)
  5. CVPR 2018 Siam-RPN:《High Performance Visual Tracking with Siamese Region Proposal Network》论文笔记
  6. Codeforces 1149 题解
  7. matlab中欠定方程组超定方程组_七年级下册第10章:解二元一次方程组(12课时)...
  8. log4j - 日志
  9. 求最大整数及其最小下标
  10. 【django之权限组件】