• Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 246
  • Last Modified:

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

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
Hojoformo
Asked:
Hojoformo
  • 4
  • 3
1 Solution
 
SnowFlakeCommented:
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
 
HojoformoAuthor Commented:
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
 
SnowFlakeCommented:
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
Industry Leaders: We Want Your Opinion!

We value your feedback.

Take our survey and automatically be enter to win anyone of the following:
Yeti Cooler, Amazon eGift Card, and Movie eGift Card!

 
HojoformoAuthor Commented:
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
 
SnowFlakeCommented:
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
 
HojoformoAuthor Commented:
Thank you very much SnowFlake for your help and patience.  
0
 
SnowFlakeCommented:
your welcome.
0

Featured Post

Free Tool: Path Explorer

An intuitive utility to help find the CSS path to UI elements on a webpage. These paths are used frequently in a variety of front-end development and QA automation tasks.

One of a set of tools we're offering as a way of saying thank you for being a part of the community.

  • 4
  • 3
Tackle projects and never again get stuck behind a technical roadblock.
Join Now