在使用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);
如果有问题,欢迎留言探讨.