Hi Christian, I just tried out your suggestion:
I created an element and immediately printed the contents of the Document, oChild = oDocument.createElement("Guest"); System.out.println(oDocument.asXML()); The output did not show the new element. So DocumentHelper.createElement() and DOMDocument.createElement() are equivalent, in the sense that when a new element is created, it is 'floating' and does not have any position in the XML document. In fact, when I tried to invoke the oChild.getParentNode() before appending it to the document, there was an error: org.w3c.dom.DOMException: Not supported yet at org.dom4j.dom.DOMNodeHelper.notSupported(DOMNodeHelper.java:463) at org.dom4j.dom.DOMNodeHelper.asDOMNode(DOMNodeHelper.java:400) at org.dom4j.dom.DOMNodeHelper.getParentNode(DOMNodeHelper.java:76) at org.dom4j.dom.DOMElement.getParentNode(DOMElement.java:96) at com.interrait.requesttracker.Dump.main(Dump.java:107) Exception in thread "main Which means that the 'newborn' node doesn't have a parent yet. If this is the case, then I think even you'll agree that insertBefore() must have something wrong with it, if it always inserts a node at the top (beginning) of the document. That was my report. Awaiting suggestions... Regards Soumanjoy -----Original Message----- From: Christian Holmqvist, IT, Posten [mailto:[EMAIL PROTECTED]] Sent: Thursday, April 25, 2002 3:28 PM To: 'Soumanjoy Das'; [EMAIL PROTECTED] Subject: RE: [dom4j-user] Add element between elements in a document. Hi! Oki, I don't use the daily build her (at work) so I can't try it out. I totally agree with you in all cases and we agree upon the result so If the result is not what it should be there is a problem in insertBefore. When a element is created based on a document i.e. in your example oDocument.createElement() it contains a parent and therefor implicit also a place in the document. Exactly what this place is I can't tell without reading the src code and see how it is handled. A simple test would be to create a document with a root element, do createElement and then without appending the created element to the document print the document. If the element shows up the element already got a position in the document otherwise this is handled in some other fashion. If instead a element is created with DocumentHandler.createElement(..) witch is a static method just creating a new Element without a parent (i.e. parent == null) there is no connection to the document. Hmm I think that was all... Cheers Christian > Hi Christian, > > First of all, I must apologize and clear some of the mistakes > in my previous > mail: > I had first tried with the line: > > oParent.appendChild(oChild).appendChild(oChild.cloneNode(false)); > > and then with simply: > > oParent.appendChild(oChild); > > Which would result in only one single Child node. Moreover, I > had tried the > code with the line > > oNodes.add(0, oGuest); > > and without it, and > > oDocument.insertBefore(oGuest, > (Node)oDocument.selectSingleNode("//Child")); > > I have tried these two statement separately and printed the > document with > System.out.println(oDocument.asXML()); > > In ALL cases, I am getting the Guest element placed right at > the top level. > I didn't understand the last part of your explanation: I DID > say that the > tree structure that you drew > > parent > | > -guest > | > -child > | > -child > > was SUPPOSED to be, had the insertBefore() method worked the > way it should > have (that is where we both agree). But it doesn't turn out > that way. And I > need to be clear about one thing: after an element has been > newly created > with Document.createElement(), and BEFORE it has been > appended to a parent > Node, does it already have a postion in the XML Document > (according to what > you say?). I don't get any errors, even in runtime - the > whole code runs and > gives the output as I have described. > > As for the compilation error, there have been some changes in > the build in > the last three days, so you'll have to take the daily build > in order for the > code to work. > > And for your question: why I'm using DOMDocument - no > particular reason. I > know there are probably 10 different ways to achieve the same > thing, but I > just wanted to explore many possibilities before choosing one > of the ways > for my next project. And I wanted especially to explore the > w3c.dom classes > because they conform with the MS-DOM structure, that's all. > > If you don't mind, I would appreciate some further > clarification on this. > Thanks > Soumanjoy > > > -----Original Message----- > From: Christian Holmqvist, IT, Posten > [mailto:[EMAIL PROTECTED]] > Sent: Thursday, April 25, 2002 12:48 PM > To: 'Soumanjoy Das'; 'James Strachan'; > [EMAIL PROTECTED] > Subject: RE: [dom4j-user] Add element between elements in a document. > > > Hi! > > First of all, I could not even run your example, got the error: > java.lang.ClassCastException: org.dom4j.tree.DefaultElement > at org.dom4j.dom.DOMDocument.createElement(DOMDocument.java:209) > at > se.posten.logistik.applications.cr.test.DOM4J_test.<init>(DOM4 > J_test.java:29 > ) > at > se.posten.logistik.applications.cr.test.DOM4J_test.main(DOM4J_ > test.java:90) > > But anyway. > If I understand the this correct does this: > oParent.appendChild(oChild).appendChild(oChild.cloneNode(false)); > add two child elements like this. > parent > | > -child > | > -child > > The list from this command will be of size two containing two > child elements > > List oNodes = oDocument.selectNodes("//Child[@id]"); //Will > > retrieve the one > > single Child Element > These are > child > | > -child > AND > child > > The next statement of value is > > oNodes.add(0, oGuest); //Doesn't affect the original document > Where in the documentation do you find that this is not > references to the > original document. At least I can not find any cloning or > detachment in the > doc or code... > > But the question is, where does the guest element go. > Intutinally I would > say, right before the first child element in the original document, > resulting in a document looking like this: > parent > | > -guest > | > -child > | > -child > > and the ofcourse first in the node list. > > BUT then this: > > oDocument.insertBefore(oGuest, > (Node)oDocument.selectSingleNode("//Child")); > should not have been allowed because the guest element > already got a parent > and a place in the document. > But on the other hand. > The guest element should be placed before the first child > element witch is > where the parent element is. And when using this in contrast > to that the > node list do indeed affect the org document and there is the > guest placed at > position 0 then the result would be that the document looks like your > result. > I would say that the document should look like: > parent > | > -guest > | > -child > | > -child > if it where correct. Don't you think so? > > Another question, why do you use the DOMDocument and not the > DocumentHelper > and org.Dom4j.Element and Document? > > Cheers Christian Holmqvist > > > -----Ursprungligt meddelande----- > > Från: Soumanjoy Das [mailto:[EMAIL PROTECTED]] > > Skickat: den 25 april 2002 06:58 > > Till: 'James Strachan'; [EMAIL PROTECTED] > > Ämne: RE: [dom4j-user] Add element between elements in a document. > > > > > > Hi, > > > > I still don't get it. If one extracts a list of nodes into a > > Java List by an > > XPath query, and then adds a node into that List, the Node > > doesn't get added > > into the original document from which the list was queried > > (makes sense > > here). The only way to do it is to use the .appenChild() or > > .insertBefore() > > etc. methods of the Document or Element. But I also observe this: > > > > When I create a new Element and try to add it to a Document as: > > document.insertBefore(newChild, refChild), the newChild is > > always inserted > > right at the BEGINNING of the document, BEFORE the document > > element, hence > > making TWO Root elements!!! (Irrespective of refChild). First > > of all, why is > > the function inserting it at the top instead of before the > > refChild element? > > Secondly, why is the function ALLOWING this insert at an > > illegal position - > > because, when I try to open the resultant XML, it obviously > > gives the error > > that there cannot be more than one Root element! > > > > Is this again an issue with org.w3c.dom as opposed to > org.dom4j.dom? > > > > Here's the code sample: > > > > import org.w3c.dom.*; > > import org.dom4j.dom.*; > > import java.util.*; > > //import etc... > > //... > > > > DOMDocument oDocument = new DOMDocument("Root"); > > //Add a Root element > > Element oParent = oDocument.createElement("Parent"); > > oParent.setAttribute("id", "P01"); > > //Add a child element > > oDocument.appendChild(oParent); > > Element oChild = oDocument.createElement("Child"); > > oChild.setAttribute("id", "C01"); > > oParent.appendChild(oChild).appendChild(oChild.cloneNode(false)); > > //Get the Child Element in a list > > List oNodes = oDocument.selectNodes("//Child[@id]"); //Will > > retrieve the one > > single Child Element > > Element oGuest = oDocument.createElement("Guest"); > > oGuest.setAttribute("name", "newcomer"); > > oNodes.add(0, oGuest); //Doesn't affect the original document > > oDocument.insertBefore(oGuest, > > (Node)oDocument.selectSingleNode("//Child")); > > System.out.println(oDocument.asXML()); > > > > Here's the Output: > > <Guest name="newcomer"/> > > <Parent id="P01"> > > <Child id="C01"/> > > </Parent> > > > > I doubt this is what .insertBefore() is supposed to do. > Have I missed > > something here...? An explanation would be appreciated... > > (Here's another > > one for you James :-). > > > > Thanks > > Soumanjoy > > > > > > -----Original Message----- > > From: James Strachan [mailto:[EMAIL PROTECTED]] > > Sent: Tuesday, April 23, 2002 8:10 PM > > To: Christian Holmqvist, IT, Posten; > [EMAIL PROTECTED] > > Subject: Re: [dom4j-user] Add element between elements in a > document. > > > > > > A Branch (a Document or Element) has a method called > > content() which returns > > a modifiable List. So you can use the standard Java 2 List > > interface to > > change the content of an Element or Document. > > > > e.g. > > > > DocumentFactory factory = new DocumentFactory(); > > Document doc = factory.createDocument(); > > Element root = doc.addElement( "html" ); > > Element header = root.addElement( "header" ); > > Element footer = root.addElement( "footer" ); > > > > // now lets add <foo> in between header & footer > > List list = root.content(); > > Element foo = factory.createElement( "foo" ); > > list.add( 1, foo ); > > > > // assertions > > assertTrue( list.size() == 3 ); > > assertTrue( list.get(0) == header ); > > assertTrue( list.get(1) == foo ); > > assertTrue( list.get(2) == footer ); > > > > > > The above code has all been added to the unit test > > dom4j/src/test/org/dom4j/TestContent in the method > > testAddingInTheMiddle(). > > > > James > > ----- Original Message ----- > > From: "Christian Holmqvist, IT, Posten" > > <[EMAIL PROTECTED]> > > To: <[EMAIL PROTECTED]> > > Sent: Tuesday, April 23, 2002 2:32 PM > > Subject: [dom4j-user] Add element between elements in a document. > > > > > > > Hi > > > > > > I have a small problem with adding elements. > > > > > > I got a document that looks something like this: > > > > > > Doc > > > | > > > --- Header > > > | > > > | > > > --- Footer > > > > > > On the document handler class (my class) there is a method > > called add > > > element. This element should be placed in between the > header and the > > footer > > > i.e: > > > > > > Doc > > > | > > > --- Header > > > | > > > -> (new element) > > > | > > > --- Footer > > > > > > My problem is that I can not figure out how to add a elemnt > > to a specific > > > position in a document. > > > > > > Help... please... > > > > > > Cheers Christian Holmqvist > > > > > > _______________________________________________ > > > 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 > > > > _______________________________________________ > > dom4j-user mailing list > > [EMAIL PROTECTED] > > https://lists.sourceforge.net/lists/listinfo/dom4j-user > > > _______________________________________________ dom4j-user mailing list [EMAIL PROTECTED] https://lists.sourceforge.net/lists/listinfo/dom4j-user _______________________________________________ dom4j-user mailing list [EMAIL PROTECTED] https://lists.sourceforge.net/lists/listinfo/dom4j-user