天天看點

dom4j 複制節點及其子節點

主子表資料,生成一個比較複雜的xml,子表可能有多條資料,由于标簽很多,有幾百個,是以手寫代碼,太複雜而且寫完可讀性不強,也不友善維護。是以想到讀取一個模闆,然後通過末尾标簽的name來setText的方式生成,然而有個問題就是子表多條時,怎麼複制一份子表的tree來,然後set值(模闆裡肯定隻能維護一個子表的tree)。首先試了直接add(element)的方法,因為有父節點是以報錯了,然後試了clone和craetcopy,但是隻能複制自己不能複制位元組點,上網搜了下,也是不行隻能複制自己,而且clone後,自己的子節點也沒有了,唯一靠譜點的方案,就是遞歸一層層複制,但是看到遞歸本能是抗拒的,可以做為打底方案,是以還是想嘗試下,于是debug,dom4j源碼看看,果然找到了方案。

add(element)報錯是因為有父節點了,然後看到clone的源碼裡有setParent(null),茅塞頓開,先setnull然後add,然後再set回來不就行了?

dom4j 複制節點及其子節點
InitgPty.setParent(null);
GrpHdr.add(InitgPty);
InitgPty.setParent(GrpHdr);
           

果然成功,但不知道為什麼,dom4jclone的函數,不讓複制子節點,源碼裡是有意把子節點clear了,所這樣操作會不會帶來風險,猶未可知,如果是dom4j有意不讓複制子節點的話,那這發現就是一個bug了。

dom4j 複制節點及其子節點