Dom4j从一个xml分离/复制节点并添加到另一个

时间:2013-08-16 16:17:51

标签: java dom4j

我实际上遍历src xml并将其转换为另一个destination xml。但src xml的一部分将被复制并添加到destination。但是当我尝试这样做时,我会跟踪例外:

could not be added to the element "<DestinationParent>" because: The Node already has an existing parent of "<SourceParent"

我正在遍历src XML并调用此函数
代码

private static Element treeWalk (Element rootElement, Element parentElement)
{
    Element moduleRootElement = doc.addElement("Request");
    if(rootElement.getName()=="someName")
    {
        moduleRootElement.add(childElement.getName());
    } else {
        moduleRootElement.add(rootElement); //If root's parent is not null I get a exception here.
        //moduleRootElement= rootElement.createCopy(); //Didn't work
    }
}

1 个答案:

答案 0 :(得分:2)

您需要在要移动的节点上调用detach()。来自dom4j JavaDocs

Node node = ...; 
Element someOtherElement = ...; 
someOtherElement.add( node.detach() );

由于Element实现了Node,如果你需要转换回Element,你可以通过投射来实现(前提是你知道你分离的东西是Element )。您的另一个选择可能是复制Element。使用您的代码作为起点:

Element moduleRootElement = doc.addElement("Request");
if (rootElement.getName().equals("someName") {
    moduleRootElement.add(childElement.getName());
} else {
    moduleRootElement.add(rootElement.createCopy());
}

看起来你真的试过这个,但并没有完全得到它。请记住,在使用=的java中,将变量重新分配给新对象。所有现有的引用都被打破了。

作为旁注,您可能还需要使用

检查根元素的名称
if(rootElement.getName().equals("someName"))

而不是使用==