Hi Frank

The trick to move nodes from one Document to the other is to use the
detach() method - this will cleanly remove the node from one place so that
you can add it somewhere else.

e.g. here's the section of your example code patched...

         ((Element)node).setAttributes(srcDocNodeAttrs);
         for (int a = 0; i < tgtDocNodeAttrs.size(); i++) {
           Attribute tmp = (Attribute)tgtDocNodeAttrs.get(a);
           // tmp.setParent(null);
            tmp.detach();
           ((Element)node).add(tmp);

James
----- Original Message -----
From: "Walinsky, Frank" <[EMAIL PROTECTED]>
To: <[EMAIL PROTECTED]>
Sent: Tuesday, April 02, 2002 5:02 PM
Subject: [dom4j-user] Attributes


> Good morning!
> I'm having a problem with retrieving attributes from a node in one
> document and posting them to a node in another document.  I can't see
> anything wrong with the code, so any help would be appreciated.  I've
> included the output and the sample code. In the target document,
> "levelB" in the 2nd instance of "levelA" has an attribute of "test".
> When I gather the corresponding attributes from the source document and
> merge them to the target document the "test" attribute that was only at
> "levelB" in the 2nd instance of "levelA" now appears on "levelB" of the
> 1st instance of "levelA".
> Thanks,
> Frank
>
> Here's the output.....
>
> Source
> <?xml version="1.0" encoding="UTF-8"?>
>
> <root>
>   <levelA lvl="A1">
>     <levelB lvl="B1"/>
>   </levelA>
>   <levelA lvl="A2">
>     <levelB lvl="B2"/>
>   </levelA>
> </root>
>
>
>
> Target before
> <?xml version="1.0" encoding="UTF-8"?>
>
> <root>
>   <levelA>
>     <levelB>instance #1</levelB>
>   </levelA>
>   <levelA>
>     <levelB test="xyz">instance #2</levelB>
>   </levelA>
> </root>
>
>
>
> Target after
> <?xml version="1.0" encoding="UTF-8"?>
>
> <root>
>   <levelA lvl="A1">
>     <levelB lvl="B1" test="xyz">instance #1</levelB>
>   </levelA>
>   <levelA lvl="A1">
>     <levelB lvl="B1" test="xyz">instance #2</levelB>
>   </levelA>
> </root>
>
>
> And the code.....
>
>
> import org.dom4j.Document;
> import org.dom4j.DocumentHelper;
> import org.dom4j.Element;
> import org.dom4j.Node;
> import org.dom4j.XPath;
> import org.dom4j.Attribute;
> import org.dom4j.io.OutputFormat;
> import org.dom4j.io.XMLWriter;>
> import java.io.IOException;
> import java.util.List;
>
> public class Z_Test_A {
>   Document docS = DocumentHelper.createDocument();
>   Element rootS = DocumentHelper.createElement("root");
>
>   Document docT = DocumentHelper.createDocument();
>   Element rootT = DocumentHelper.createElement("root");
>
>   private void test() {
>     Element levelA = DocumentHelper.createElement("levelA");
>     levelA.addAttribute("lvl", "A1");
>     Element levelB = DocumentHelper.createElement("levelB");
>     levelB.addAttribute("lvl", "B1");
>     levelA.add(levelB);
>     rootS.add(levelA);
>     levelA = DocumentHelper.createElement("levelA");
>     levelA.addAttribute("lvl", "A2");
>     levelB = DocumentHelper.createElement("levelB");
>     levelB.addAttribute("lvl", "B2");
>     levelA.add(levelB);
>     rootS.add(levelA);
>     docS.add(rootS);
>     try {
>       OutputFormat format = OutputFormat.createPrettyPrint();
>       format.setIndentSize(2);
>       System.out.println("Source");
>       XMLWriter writer = new XMLWriter(System.out, format);
>       writer.write(docS);
>       System.out.println("\n\n");
>     }
>     catch (IOException e) {
>     }
>
>     levelA = DocumentHelper.createElement("levelA");
>     levelB = DocumentHelper.createElement("levelB");
>     levelB.setText("instance #1");
>     levelA.add(levelB);
>     rootT.add(levelA);
>     levelA = DocumentHelper.createElement("levelA");
>     levelB = DocumentHelper.createElement("levelB");
>     levelB.setText("instance #2");
>     levelB.addAttribute("test", "xyz");
>     levelA.add(levelB);
>     rootT.add(levelA);
>     docT.add(rootT);
>     try {
>       OutputFormat format = OutputFormat.createPrettyPrint();
>       format.setIndentSize(2);
>       System.out.println("Target before");
>       XMLWriter writer = new XMLWriter(System.out, format);
>       writer.write(docT);
>       System.out.println("\n\n");
>     }
>     catch (IOException e) {
>     }
>
>     treeWalk(docT.getRootElement());
>
>     try {
>       OutputFormat format = OutputFormat.createPrettyPrint();
>       format.setIndentSize(2);
>       System.out.println("Target after");
>       XMLWriter writer = new XMLWriter(System.out, format);
>       writer.write(docT);
>       System.out.println("\n\n");
>     }
>     catch (IOException e) {
>     }
>
>   }
>
>   private void treeWalk(Element element) {
>     for (int i = 0, size = element.nodeCount(); i < size; i++) {
>       Node node = element.node(i);
>       if (node instanceof Element) {
>         List tgtDocNodeAttrs = ((Element)node).attributes();
>         List srcDocNodeAttrs =
> ((Element)docS.selectSingleNode(((Element)node).getPath())).attributes()
> ;
>         ((Element)node).setAttributes(srcDocNodeAttrs);
>         for (int a = 0; i < tgtDocNodeAttrs.size(); i++) {
>           Attribute tmp = (Attribute)tgtDocNodeAttrs.get(a);
>           tmp.setParent(null);
>           ((Element)node).add(tmp);
>         }
>         treeWalk((Element) node);
>       }
>     }
>   }
>
>   public static void main(String[] args) {
>     Z_Test_A z = new Z_Test_A();
>     z.test();
>   }
>
> }
>
> _______________________________________________
> dom4j-user mailing list
> [EMAIL PROTECTED]
> https://lists.sourceforge.net/lists/listinfo/dom4j-user


_________________________________________________________
Do You Yahoo!?
Get your free @yahoo.com address at http://mail.yahoo.com


_______________________________________________
dom4j-user mailing list
[EMAIL PROTECTED]
https://lists.sourceforge.net/lists/listinfo/dom4j-user

Reply via email to