将克隆的子节点附加到克隆节点

时间:2015-05-06 10:09:40

标签: java dom clone appendchild

假定以下XML:

<outer>
    <entity>
        <id>123</id>
        <subnode1>
        <subnode2>
    </entity>
    <entity>
        <id>124</id>
        <subnode1>
        <subnode2>
    </entity>
</outer>

总的来说,我想将实体节点拆分为单独的文件。我已经提取了实体节点并将它们存储在Map中,其中相应的文本值作为map键。这对我来说绝对没问题。

现在我想将片段写入新的XML文件(ID作为文件名)。我需要保留外部标签。因此,我调用以下方法来获取外部节点:

private static Node cloneEmbeddingAncestors(final Node aItem) {
    Node parent = aItem.getParentNode();
    if (parent.equals(((Element) aItem).getOwnerDocument())) {
        // we've reached top level
        return aItem.cloneNode(false);
    }
    Node clone = cloneEmbeddingAncestors(parent);
    return clone.appendChild(aItem.cloneNode(false));
}

在调试该方法的最后一行时,我得到:

  • clone:“[outer:null]”(看起来不错)
  • aItem:“[entity:null]”(看起来也不错)
  • aItem.cloneNode(false):“[entity:null]”(看起来也不错)

但是:整个表达

  • clone.appendChild(aItem.cloneNode(假))

还提供“[entity:null]”?!? (生成的XML片段也只显示“实体”标签。我希望在调试显示中的文件resp。“outer”节点中有一些“外部”标签。)

现在,为什么?任何帮助都非常适合!谢谢!

1 个答案:

答案 0 :(得分:0)

我想我已经明白了。我的错误是在最后一个return语句中调用appendChild()。 appendChild()返回一个Node,但是返回一个Node(子节点,而不是父节点)。当然,这种方法的想法是以递归方式返回外部(父)节点。因此,如果我将最后一个代码行替换为:

Node clone = cloneEmbeddingAncestors(parent);
clone.appendChild(aItem.cloneNode(false));
return clone;

......一切都按设计工作。希望有一天能帮助别人。