Solved

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

Posted on 2006-10-22
7
231 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
Highfive Gives IT Their Time Back

Highfive is so simple that setting up every meeting room takes just minutes and every employee will be able to start or join a call from any room with ease. Never be called into a meeting just to get it started again. This is how video conferencing should work!

 

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

What Should I Do With This Threat Intelligence?

Are you wondering if you actually need threat intelligence? The answer is yes. We explain the basics for creating useful threat intelligence.

Join & Write a Comment

Suggested Solutions

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…
Many times as a report developer I've been asked to display normalized data such as three rows with values Jack, Joe, and Bob as a single comma-separated string such as 'Jack, Joe, Bob', and vice versa.  Here's how to do it. 
Internet Business Fax to Email Made Easy - With eFax Corporate (http://www.enterprise.efax.com), you'll receive a dedicated online fax number, which is used the same way as a typical analog fax number. You'll receive secure faxes in your email, fr…
This video demonstrates how to create an example email signature rule for a department in a company using CodeTwo Exchange Rules. The signature will be inserted beneath users' latest emails in conversations and will be displayed in users' Sent Items…

705 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

Need Help in Real-Time?

Connect with top rated Experts

18 Experts available now in Live!

Get 1:1 Help Now