您的位置:首页 > 编程语言 > Java开发

Java递归算法给基于dom4j创建一个完全相同的节点(包括属性、子节点和文本等)

2017-06-13 14:08 288 查看
在使用dom4j的时候,如果将xml的节点遍历放在集合里,然后在xml文档中某处插入某个节点的时候,如果将list集合的节点取出来,是没有办法直接用add(Element)插入的,每次都是到这个点就自己停止了,也不报错.

几个探讨研究了一下,有一种方法:

就是将从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);


如果有问题,欢迎留言探讨.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java xml 递归算法 dom
相关文章推荐