Java DOM如何复制和移动节点

1次阅读

java dom中复制节点用clonenode(Boolean)创建新节点,深复制含子节点,浅复制仅当前节点;移动节点本质是先removeChild再appendChild,同一节点不能同时存在于两处。

Java DOM如何复制和移动节点

Java DOM 中复制和移动节点主要通过 Node 接口cloneNode(boolean)appendChild()insertBefore()replaceChild()removeChild() 等方法实现。关键区别在于:复制是创建新节点,移动是改变已有节点在树中的位置。

DOM 节点复制:用 cloneNode() 深浅拷贝

cloneNode(boolean deep) 是唯一标准的复制方法。参数为 true 时执行深复制(包含所有子节点和属性),为 false 时只复制当前节点(浅复制,无子节点)。

  • 克隆后的节点是“孤儿”,不自动挂载到文档中,需手动调用 appendChild()insertBefore() 添加
  • 克隆节点的 parentNodeNULL,且与原节点无引用关系,修改互不影响
  • 示例:复制一个

    Hello

    并追加到 body:

    Element div = (Element) doc.getElementById("box");
    Node clone = div.cloneNode(true);
    doc.getDocumentElement().appendChild(clone);

DOM 节点移动:本质是“先移除再插入”

DOM 中没有直接的 “move” 方法。移动节点实际是将其从原父节点中移除,再添加到新父节点下——这一步自动完成,无需克隆。

立即学习Java免费学习笔记(深入)”;

  • 调用 parentNode.removeChild(node) 后,该节点仍有效,可被重复添加(只要没被垃圾回收)
  • 同一节点不能同时存在于两个位置;若已存在目标父节点中,再次 appendChild() 会先隐式移除原位置,再插入新位置
  • 常用组合:
    oldParent.removeChild(node);
    newParent.appendChild(node);

    等价于更简洁的:
    newParent.appendChild(node); // 若 node 原属 oldParent,会自动脱离

安全移动节点:避免空指针与非法操作

移动前建议检查节点状态,防止运行时异常。

  • 确认节点非 null,且有有效父节点(node.getParentNode() != null)再调用 removeChild()
  • 确保目标父节点不为 null,且类型支持添加该节点(例如不能把 Document 直接 append 到 Element
  • 若需将节点从 A 移到 B 的指定位置(如插到第 2 个子节点前),用:
    newParent.insertBefore(node, newParent.getChildNodes().item(1));

复制并移动的常见组合用法

有时需要“复制一份放到别处”,或“移动后保留原位副本”,这时要明确区分 clone + append 和 remove + append。

  • 复制并追加(原节点不动):parent.appendChild(node.cloneNode(true));
  • 移动并替换(原位置被新内容替代):parent.replaceChild(newNode, oldNode);
  • 移动到兄弟节点之后:parent.insertBefore(node, nextSibling);(注意 nextSibling 可为 null,此时等效于 appendChild

text=ZqhQzanResources