Question

I am actually traversing src xml and converting it into another destination xml. But part of src xml will be just copied and added to the destination. But when I am trying to do that I am getting following Exception:

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

I am traversing src XML and calling this function
Code

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
    }
}
Was it helpful?

Solution

You need to call detach() on the node you want to move. From the dom4j JavaDocs

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

Since Element implements Node if you need to convert back to Element you can do it just by casting (provided you know that the thing you detached was an Element). Another option for you might be to copy the Element. Using your code as a starting point:

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

It looks like you actually tried this, but didn't quite get all the way there. Remember, in java using = reassigns the variable to the new object. All the existing references to it are broken.

As a side note, you probably also need to check your root element's name with

if(rootElement.getName().equals("someName"))

instead of using ==

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top