Java递归算法给基于dom4j创建一个完全相同的节点(包括属性、子节点和文本等)
2017-06-13 14:08
288 查看
在使用dom4j的时候,如果将xml的节点遍历放在集合里,然后在xml文档中某处插入某个节点的时候,如果将list集合的节点取出来,是没有办法直接用add(Element)插入的,每次都是到这个点就自己停止了,也不报错.
几个探讨研究了一下,有一种方法:
就是将从list集合里取出来的,先通过Document转换,再获取Element根元素加进去.
这种方法,非常的恶心,又要遍历集合了.
还有一种方法:
xml可以插入一个新创建的元素(Element);那就创建一个新的元素放进去.
根据第二种方法,我们就要从list集合里取出来一个节点,然后原模原样的创建一个新的,虽然这个也不是很简单,但是这也方便后期做一个工具类.
之所以选择递归的算法,是因为递归算法代码不是很多很复杂.但是递归很消耗内存.具体原因,网上一大堆大神都说的很清楚了.但是对于原模原样的跟着某个元素创建一模一样的元素,对内存的消耗还好一点.当然,特殊情况除外.
因为也是刚写这个递归的方法,也没有优化,现在写在这里,可以参考参考,记录一下,方便以后使用.当然,也希望各大牛提意见,小弟定当感谢:
在调用的时候,只需要
如果有问题,欢迎留言探讨.
几个探讨研究了一下,有一种方法:
就是将从list集合里取出来的,先通过Document转换,再获取Element根元素加进去.
这种方法,非常的恶心,又要遍历集合了.
还有一种方法:
xml可以插入一个新创建的元素(Element);那就创建一个新的元素放进去.
根据第二种方法,我们就要从list集合里取出来一个节点,然后原模原样的创建一个新的,虽然这个也不是很简单,但是这也方便后期做一个工具类.
之所以选择递归的算法,是因为递归算法代码不是很多很复杂.但是递归很消耗内存.具体原因,网上一大堆大神都说的很清楚了.但是对于原模原样的跟着某个元素创建一模一样的元素,对内存的消耗还好一点.当然,特殊情况除外.
因为也是刚写这个递归的方法,也没有优化,现在写在这里,可以参考参考,记录一下,方便以后使用.当然,也希望各大牛提意见,小弟定当感谢:
/** * 递归创建一个需要复制的Element元素 * 为了方便在xml中某个位置插入某个元素 * @param element 需要复制的元素 * @return 按照指定元素创建好的临时元素,可以插入到指定的xml文档位置中 */ private Element recursiveCreateEleForCopy(Element element){ Element temp=DocumentHelper.createElement(element.getName()); //如果元素里面有文本 if (StringUtils.isNotBlank(element.getText())) { //logger.info("element.getText()==="+element.getName()+"===="+element.getText()); temp.setText(element.getText()); } //如果元素里面有属性 ,就迭代放进去 if(element.attributes().size()>0){ for(Iterator iter=element.attributeIterator();iter.hasNext();){ Attribute attr=(Attribute) iter.next(); //把属性添加进去 temp.addAttribute(attr.getName(), attr.getText()); }; } //如果有子节点 List<Element> subEleList=element.elements(); if(subEleList.size()>0){ //遍历,调用recursiveCreateEleForCopy for(Element subE : subEleList){ //递归调用本方法 temp.add(recursiveCreateEleForCopy(subE)); } } return temp; }
在调用的时候,只需要
//根据递归,查找元素,并原样创建一个元素 Element tempE=recursiveCreateEleForCopy(affterForewordEle); //根据位置插入元素(我在0位置) contenttextEle.elements().add(0,tempE);
如果有问题,欢迎留言探讨.
相关文章推荐
- 这是一个关于XML文档的操作管理器XMLHelper类,类中包括XML文档的创建,文档节点和属性的读取,添加,修改,删除的方法功能的实现
- 11.21课堂笔记-查找节点和创建节点、插入节点和删除节点、复制节点替换节点、包裹节点和属性操作、样式操作、设置和获取HTML、文本和值
- DOM创建元素、属性、文本节点
- 如何创建一个与已知的一个表完全相同结构的新表(包括主键、外键、索引),同时将数据导入新表
- 怎样在创建TreeView时为每一个节点的data属性赋予一个长字符串值(长度不确定,几十个字符或者上万个字符),在单击节点的时候再将每个节
- 要求从用户输入的多行文本中提取学生的姓名、学号及登录日期,并封装到 Student 类中作为类的私有属性。创建一个 Student 类型的对象数组,对学号进行 升序排序并输出
- JS基于FileSystemObject创建一个指定路径的TXT文本文件
- Dom4j解析XML文本,遍历指定节点下的节点内容和属性,并存入List<Map<String,Object>
- 要求从用户输入的多行文本中提取学生的姓名、学号及登录日期,并封装到 Student 类中作为类的私有属性。创建一个Student类型的对象数组,对学号进行 升序排序并输出。
- JS基于FileSystemObject创建一个指定路径的TXT文本文件
- dom4j修改节点属性及写入文件
- 一个可分页的基于文本的PHP留言板源码第1/2页
- 创建一个xml文件(c:/test.html),为该文件增加三个节点,,,将b的attribute改为4并保存
- SPServer : 一个基于线程池(包括HAHS和LF)的高并发 server 框架
- 创建一个滚动的文本字幕。
- 采用DOM模型时创建一个Select节点后,要删除option项的解决方法
- javascript DOM 编程方法——创建文本节点
- 创建一个基于命令行的简单的播放器
- VS2005 ASP.NET2.0安装项目的制作(包括数据库创建、站点创建、IIS属性修改、Web.Config文件修改)
- 创建一个基于Struts2的Web应用