Granny's Programming Pearls
"inside of every large program is a small program struggling to get out"
JavaRanch.com/granny.jsp
The moose likes XML and Related Technologies and the fly likes little confusion with appendChild() Big Moose Saloon
  Search | Java FAQ | Recent Topics | Flagged Topics | Hot Topics | Zero Replies
Register / Login


Win a copy of Android Security Essentials Live Lessons this week in the Android forum!
JavaRanch » Java Forums » Engineering » XML and Related Technologies
Bookmark "little confusion with appendChild()" Watch "little confusion with appendChild()" New topic
Author

little confusion with appendChild()

jeff willis
Greenhorn

Joined: Jul 29, 2004
Posts: 25
Here is my XML file: (sort of)
<ledger>
<transaction>
<data> DATA1 </data>
</transaction>

<transaction>
<data> DATA2 </data>
</transaction>

</ledger>

My application needs to append another TRANSACTION ELEMENT after the DATA2 transaction element. However, my output ends up looking like this:

<ledger>
<transaction>
<data> DATA1 </data>
</transaction>

<transaction>
<data> DATA2 </data>
<TRANSACTION><DATA>data3</DATA></TRANSACTION>
</transaction>

</ledger>


??? How did it end up there?

Here is a code sample:

// get the root, then get all the transactions
// then get the last transaction...
Element root = document.getDocumentElement();
NodeList nl = root.getElementsByTagName("transaction");
Node lastTransaction = nl.item( (nl.getLength()-1) );

// create a new element...
Element descElement = createXMLElement( "DATA",
txtData.getText());

// create another new element for the new transaction record...
Element newTransaction = document.createElement("TRANSACTION");


// place the new "data" with the new transaction...
newTransaction.appendChild(descElement);

// finally, place the new transaction in the document
lastTransaction.appendChild(newTransaction);


...and the new transaction ends up in a place where I didn't expect it.
I'm using the javax.xml.transform class to print out my document to screen to verify that the insert took place.

So...basically I need to know what I'm doing wrong. I need to be able to append new TRANSACTION element to my document.
Lasse Koskela
author
Sheriff

Joined: Jan 23, 2002
Posts: 11962
    
    5
This line:

does not append newTransaction after lastTransaction. It appends it as lastTransaction's child as the method name, appendChild(), implies.


Author of Test Driven (2007) and Effective Unit Testing (2013) [Blog] [HowToAskQuestionsOnJavaRanch]
jeff willis
Greenhorn

Joined: Jul 29, 2004
Posts: 25
Yeah, I guess I'm seeing that for myself now. It's still confusing though because if I execute this line of code:

System.out.println("lastTransaction = " + lastTransaction);

The output shows the entire last transaction (i.e. transaction #2). By that I mean all the elements and text between the <transaction> </transaction> tags show up in the output.

By looking at that output, I figured that I was where I needed to be inside the document.


Any idea how I would add another TRANSACTION to my document?
jeff willis
Greenhorn

Joined: Jul 29, 2004
Posts: 25
Well, it looks as if I've stumbled onto my own solution here...

I commented out my original appendChild() call and replaced it with an appendChild() call from the root of the document

My code now looks like this:



It works, but I'm wondering if this how the method is supposed to be called in this situation???
Lasse Koskela
author
Sheriff

Joined: Jan 23, 2002
Posts: 11962
    
    5
Originally posted by jw wvu:

It works, but I'm wondering if this how the method is supposed to be called in this situation???

Yes. Before that statement, the root element (<ledger>...</ledger> contains one child (lastTransaction). After executing that statement, it contains two (lastTransaction and newTransaction).
 
I agree. Here's the link: http://aspose.com/file-tools
 
subject: little confusion with appendChild()
 
Similar Threads
NX: Bodgitt and Scarper and design/synchronization questions
XSL Table output.
Passing data to JSP
One big XML file or lots of small ones
xsl:if and XPath