Solved

Simple question - need help with creating a new XML element using DOM

Posted on 2006-10-22
7
233 Views
Last Modified: 2008-03-06
I am trying to understand how to create new XML elements using DOM.  I figured out how to create new elements but the opening element I am creating has a closing tag (/) on it.  See the BillingCycleData element below.  What am I doing wrong?

<BillingCycleData /> ??? i need to get rid of the "/"
  <BillingCycleData meterReadDate="200609" revenue="140.98" usuage="1348" />
<BillingCycleData />

Here is my code

 Set oXMLData1 = oXML.CreateElement("BillingCycleData")  ----> this creates the <BillingCycleData />
 oXML.documentElement.appendChild(oXMLData1.cloneNode(true))  
 
 for HRi = 0 to UBound(results, 2)
 
  Set oXMLData = oXML.CreateElement("BillingCycleData")
    oXMLData.setAttribute "meterReadDate", results(BILL_DATE, HRi)
    oXMLData.setAttribute "revenue", results(BILL_AMOUNT, HRi)
    oXMLData.setAttribute "usuage", results(KILOWATT_USAGE, HRi)
    oXML.documentElement.appendChild(oXMLData.cloneNode(True))  
 next
 
 ' write New record  
 oXML.documentElement.appendChild(oXMLData1.cloneNode(True))   --->  this creates the closing <BillingCycleData />
 oXML.documentElement.appendChild(oXMLRec.cloneNode(True))  
0
Comment
Question by:Hojoformo
  • 4
  • 3
7 Comments
 
LVL 15

Expert Comment

by:SnowFlake
ID: 17784660
as long as your nodes don have children they will rende as <node />

if you add children to that node it will render with an opening and closing tag.

you are just adding the BillingCycleData to the document as siblings of what you wanted to be the parents.

  Set oXMLData = oXML.CreateElement("BillingCycleData")
    oXMLData.setAttribute "meterReadDate", results(BILL_DATE, HRi)
    oXMLData.setAttribute "revenue", results(BILL_AMOUNT, HRi)
    oXMLData.setAttribute "usuage", results(KILOWATT_USAGE, HRi)
    //oXML.documentElement.appendChild(oXMLData.cloneNode(True))  
    oXMLData1.appendChild(oXMLData.cloneNode(True))  

 next

and drop the final line that as you commented "creates the closing <BillingCycleData />"

SnowFlake
0
 

Author Comment

by:Hojoformo
ID: 17784813
Hi SnowFlake,

   Thanks for the quick response.  The "<billingCycleData />"  and "<BillingCycleData> " need to be two separate elements.   The code I posted did not reflect the lower case "b" for the  "<billingCycleData />"  element I am trying to create.  Here is what how my XML file looks now:

<?xml version="1.0" ?>
- <BillingData xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://apogee.net/WebService">
  <billingCycleData /> ?????? help me get rid of this closing tag
  <BillingCycleData meterReadDate="200510" revenue="88.04" usuage="1093" />
  <BillingCycleData meterReadDate="200509" revenue="118.94" usuage="1208" />
  <billingCycleData />
  </BillingData>

I am only having a problem with the closing tag on the 1st occurance of <billingCycleData />.

 Set oXMLData1 = oXML.CreateElement("billingCycleData")
 oXML.documentElement.appendChild(oXMLData1.cloneNode(true))  --> Create opening  <billingCycleData> ????
 
 for HRi = 0 to UBound(results, 2)
 
  Set oXMLData = oXML.CreateElement("BillingCycleData")
    oXMLData.setAttribute "meterReadDate", results(BILL_DATE, HRi)
    oXMLData.setAttribute "revenue", results(BILL_AMOUNT, HRi)
    oXMLData.setAttribute "usuage", results(KILOWATT_USAGE, HRi)
    oXML.documentElement.appendChild(oXMLData.cloneNode(True))  
   
 next
 
 ' write New record  
 oXML.documentElement.appendChild(oXMLData1.cloneNode(True))   --> Create closing <billingCycleData />
0
 
LVL 15

Expert Comment

by:SnowFlake
ID: 17784935
again, this is becuase you are adding its child nodes as a children of the document.

if instead of
  <billingCycleData /> ?????? help me get rid of this closing tag
  <BillingCycleData meterReadDate="200510" revenue="88.04" usuage="1093" />
  <BillingCycleData meterReadDate="200509" revenue="118.94" usuage="1208" />
  <billingCycleData />
  </BillingData>

you want
  <billingCycleData> ?????? help me get rid of this closing tag
     <BillingCycleData meterReadDate="200510" revenue="88.04" usuage="1093" />
     <BillingCycleData meterReadDate="200509" revenue="118.94" usuage="1208" />
  </billingCycleData>
  </BillingData>


you need to add the BillingCycleData elements as children of the biliingCycleData node,

so

replace
for HRi = 0 to UBound(results, 2)
 
  Set oXMLData = oXML.CreateElement("BillingCycleData")
    oXMLData.setAttribute "meterReadDate", results(BILL_DATE, HRi)
    oXMLData.setAttribute "revenue", results(BILL_AMOUNT, HRi)
    oXMLData.setAttribute "usuage", results(KILOWATT_USAGE, HRi)
    oXML.documentElement.appendChild(oXMLData.cloneNode(True))  
 next

with

for HRi = 0 to UBound(results, 2)
 
  Set oXMLData = oXML.CreateElement("BillingCycleData")
    oXMLData.setAttribute "meterReadDate", results(BILL_DATE, HRi)
    oXMLData.setAttribute "revenue", results(BILL_AMOUNT, HRi)
    oXMLData.setAttribute "usuage", results(KILOWATT_USAGE, HRi)
    oXMLData1.appendChild(oXMLData.cloneNode(True))                   //<--- change was in this line
   
 next


also note that you are not creating tags but rather Nodes in a tree.

so  <billingCycleData /> is not a closing tag but a node that has no childNodes.

I hope this helps.

SnowFlake
0
Master Your Team's Linux and Cloud Stack

Come see why top tech companies like Mailchimp and Media Temple use Linux Academy to build their employee training programs.

 

Author Comment

by:Hojoformo
ID: 17785025
I understand your response now.  However, when I make this change, it does not create any of the child nodes for <billingCycleData />.  I am sure this has something to do with oXMLData1.appendChild(oXMLData.cloneNode(True)).  Any suggestions?  my xml file looks like:

<?xml version="1.0" ?>
- <BillingData xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://apogee.net/WebService">
  <UtilityId />
  <billingCycleData />
  </BillingData>


dim oXMLData1
 Set oXMLData1 = oXML.CreateElement("billingCycleData")
     oXML.documentElement.appendChild(oXMLData1.cloneNode(true))  
 
 for HRi = 0 to UBound(results, 2)
 
  Set oXMLData = oXML.CreateElement("BillingCycleData")
    oXMLData.setAttribute "meterReadDate", results(BILL_DATE, HRi)
    oXMLData.setAttribute "revenue", results(BILL_AMOUNT, HRi)
    oXMLData.setAttribute "usuage", results(KILOWATT_USAGE, HRi)
    'oXML.documentElement.appendChild(oXMLData.cloneNode(True))  
    oXMLData1.appendChild(oXMLData.cloneNode(True))  
   
 next
0
 
LVL 15

Accepted Solution

by:
SnowFlake earned 500 total points
ID: 17785389
yes, of course,
as I noted on another one of your Q's
you are needlessly cloneing the nodes
whay happened in the example above is that you added to the document a clone of the node assigned to oXMLData1
and then the loop added the subnodes to the original node that is still assigned to oXMLData1

so change
 oXML.documentElement.appendChild(oXMLData1.cloneNode(true))
to
oXML.documentElement.appendChild(oXMLData1)

and also
oXMLData1.appendChild(oXMLData.cloneNode(True))
to
oXMLData1.appendChild(oXMLData)

although if you will leave the lastone you will still get the results you where looking for,
it is still bad for performance and there is no reason to do that as it is a node you just created.

You should use cloneNode when you need to create a copy of an existing node to prevent cross pointers.

SnowFlake
0
 

Author Comment

by:Hojoformo
ID: 17787528
Thank you very much SnowFlake for your help and patience.  
0
 
LVL 15

Expert Comment

by:SnowFlake
ID: 17787541
your welcome.
0

Featured Post

Master Your Team's Linux and Cloud Stack

Come see why top tech companies like Mailchimp and Media Temple use Linux Academy to build their employee training programs.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

The Client Need Led Us to RSS I recently had an investment company ask me how they might notify their constituents about their newsworthy publications.  Probably you would think "Facebook" or "Twitter" but this is an interesting client.  Their cons…
Browsing the questions asked to the Experts of this forum, you will be amazed to see how many times people are headaching about monster regular expressions (regex) to select that specific part of some HTML or XML file they want to extract. The examp…
This video shows how to use Hyena, from SystemTools Software, to bulk import 100 user accounts from an external text file. View in 1080p for best video quality.
The Email Laundry PDF encryption service allows companies to send confidential encrypted  emails to anybody. The PDF document can also contain attachments that are embedded in the encrypted PDF. The password is randomly generated by The Email Laundr…

777 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question