Still celebrating National IT Professionals Day with 3 months of free Premium Membership. Use Code ITDAY17

x
?
Solved

Counting Nodes in a DOM Document Object

Posted on 2002-05-14
12
Medium Priority
?
679 Views
Last Modified: 2013-11-19
I am new to XML and am trying to find some information for navigating an XML document using ASP with the MSXML object (MSXML2.DOMDocument.3.0).  

I am trying to count the number of child nodes with a certain name and then load an array with all the elements in that node.  

Example:  

<DOCUMENT>
 <MY_INFO>
  <QMTB_WERKS>P000</QMTB_WERKS>
  <VERWMERKM>50000524</VERWMERKM>
  <KURZTEXT>FLASH POINT, C, PMCC</KURZTEXT>
  <CSOLLWERT>85</CSOLLWERT>
  <SOLLWNI>X</SOLLWNI>
  <CTOLERANZB />
  <TOLOBNI />
  <CTOLERANZN />
  <TOLUNNI />
  <ZPROPERTY>Physical</ZPROPERTY>
 </MY_INFO>
 <MY_INFO>
  <QMTB_WERKS>P000</QMTB_WERKS>
  <VERWMERKM>50000569</VERWMERKM>
  <KURZTEXT>LBS PER GAL @ 15.6 C</KURZTEXT>
  <CSOLLWERT>7.69</CSOLLWERT>
  <SOLLWNI>X</SOLLWNI>
  <CTOLERANZB />
  <TOLOBNI />
  <CTOLERANZN />
  <TOLUNNI />
  <ZPROPERTY>Physical</ZPROPERTY>
 </MY_INFO>
</DOCUMENT>

Using this example, I would like to count the number of nodes named "MY_INFO".  Then I would like to loop through only those nodes and load each element of those nodes into an array for display within an HTML page at a later time.

Thanks for your help!

DW

0
Comment
Question by:dwadek
[X]
Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people just like you are talking about what matters.

  • Help others & share knowledge
  • Earn cash & points
  • Learn & ask questions
  • 7
  • 5
12 Comments
 
LVL 1

Expert Comment

by:sgerlach
ID: 7009305
Use selectNodes.  That will return you a list that you can loop through.

Example:

var doc = new ActiveXObject("Msxml2.DOMDocument30");
doc.load("yourfile.xml");
var nodelist = doc.selectNodes("//MY_INFO");
var len = nodelist.length;
for (var i=0; i<len; i++)
{
  var node = nodelist.item(i);
  ...
}
0
 

Author Comment

by:dwadek
ID: 7009324
Is the example you give written in Perl or JavaScript?
I've been trying to use selectNodes within
my ASP page using VBScript to no avail.  

I have a loaded MSXML DOMDocument Object already but haven't been able to navigate the structure:

<%@ Language=VBScript %>
<%     Dim objXML
     
     Set objXML = Server.CreateObject("MSXML2.DOMDocument.3.0")

objXML.loadXML(strOutputXML)


%>


I'm loading my objXML object with output XML retrieved from a Web Service.  I've checked and it is loaded properly and valid (I can display the objXML.xml).




0
 
LVL 1

Expert Comment

by:sgerlach
ID: 7009492
My example is Javascript.  I am not very proficient at VBScript, but here is probably what you need:


Set objXML = Server.CreateObject("MSXML2.DOMDocument.3.0")
objXML.loadXML(strOutputXML)

Set nodelist = doc.selectNodes("//MY_INFO");
For Each node in nodelist
{
 ...
}
0
CHALLENGE LAB: Troubleshooting Connectivity Issues

Goal: Fix the connectivity issue in the lab's AWS environment so that you can SSH into the provided EC2 instance.  

 

Author Comment

by:dwadek
ID: 7009544
I think I've translated your example correctly into VBScript ...
------------------------------------------------------
x = 0
Set nodelist = objXML.selectNodes("//MY_INFO")
For Each node in nodelist
  x = x + 1
Next
Response.Write x
-------------------------------------------------------

I get 0 for x though.  This is what happened to me before when I tried using the selectNodes method.  It made me suspicious of the ("//MY_INFO").  Is there anyway to list out the nodes from the root (DOCUMENT) with code like this ???  
0
 

Author Comment

by:dwadek
ID: 7009550
The string that I'm using and loading into the objXML object might not be structured like I'm expecting it to be and I would like to verify this structure by looping through the objXML and pulling up the node names and hopefully finding one that says "MY_INFO" at some level.  

0
 
LVL 1

Expert Comment

by:sgerlach
ID: 7009569
The XPath "//MY_INFO" should find that node at any level.  Two things to try:

(1)Make sure your document loaded properly
if (!objXML.loadXML(strOutputXML))
{
Response.Write "Error"
}

(2)If loaded properly, see what you have loaded
objXML.save("c:\temp\myxml.xml");
or
(if you have a server-side debugger)
Dim xml = objXML.xml
0
 

Author Comment

by:dwadek
ID: 7009582
I just figured out that the xml being loading into the object had a problem.  So now I'm getting closer.  

Now my code returns the correct number of nodes with the name "MY_INFO"  ... Now for the second part of the question:


"...and then load an array with all the
elements in that node."

0
 
LVL 1

Expert Comment

by:sgerlach
ID: 7009596
Is this what you need?
Set children = node.childNodes
0
 

Author Comment

by:dwadek
ID: 7009620
In what context?  (i.e. I am able to detect the 7 instances of the node I was looking for (MY_INFO) but now I want to be able to reference all the child node names as well as their values.  I'm not sure how to use the code that you suggested within my collection of nodes with
the "MY_INFO")

0
 

Author Comment

by:dwadek
ID: 7009632
Using this logic to iterate through the collection:

Set nodelist = objXML.selectNodes("//MY_INFO")
  For Each node in nodelist
    IF node.hasChildNodes THEN
    { this is where I need to store get the child node names and values }
    End IF
  Next
0
 
LVL 1

Accepted Solution

by:
sgerlach earned 200 total points
ID: 7009691
Dim childnames
Dim childvalues
Set nodelist = objXML.selectNodes("//MY_INFO")
 For Each node in nodelist
   IF node.hasChildNodes THEN
     //not sure how you have the arrays initialized
     //
     //don't really need in array, because can
     //access directly from children list
     //but here is an example anyway
     Dim i = 0
     For Each child in node.childNodes THEN
        childnames(i) = child.nodeName
        childvalues(i) = child.nodeValue
        i= i+1
     Next
   End IF
 Next
0
 

Author Comment

by:dwadek
ID: 7010824
Thanks for all your help.  I had to modify the code a little and I'm not sure if the syntax is right with the arrays as I was getting errors, but I'm on the right track from here.  Here is the code with the modifications:


     Dim i
     
        Set nodelist = objXML.selectNodes("//MY_INFO")
     For Each node in nodelist
          IF node.hasChildNodes THEN
               Response.Write "<br>"
               i = 0
               For Each child in node.childNodes
                    'display child node names & values
                    Response.Write child.nodeName & " - " & child.text & "<br>"
                    i= i+1
               Next
               
         End IF
     Next

 
0

Featured Post

What does it mean to be "Always On"?

Is your cloud always on? With an Always On cloud you won't have to worry about downtime for maintenance or software application code updates, ensuring that your bottom line isn't affected.

Question has a verified solution.

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

Preface This is the third article about the EE Collaborative Login Project. A Better Website Login System (http://www.experts-exchange.com/A_2902.html) introduces the Login System and shows how to implement a login page. The EE Collaborative Logi…
The Confluence of Individual Knowledge and the Collective Intelligence At this writing (summer 2013) the term API (http://dictionary.reference.com/browse/API?s=t) has made its way into the popular lexicon of the English language.  A few years ago, …
The viewer will receive an overview of the basics of CSS showing inline styles. In the head tags set up your style tags: (CODE) Reference the nav tag and set your properties.: (CODE) Set the reference for the UL element and styles for it to ensu…
The viewer will the learn the benefit of plain text editors and code an HTML5 based template for use in further tutorials.

721 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