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