Improve company productivity with a Business Account.Sign Up

x
  • Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 291
  • Last Modified:

Getting a list of Nodes by tag name, starting at a particular Node in the tree...

I'm new to XML. I want to get a list of Nodes by tag name, but starting at some node/depth in the tree - not starting at the top level.

For example, if I have the following simple XML file:

<?xml version="1.0" encoding="ISO-8859-1"?>
<store>
     <item iName="widget1">
          <title> Widget One </title>
          <baseprice> 35.00 </baseprice>
          <repeat> x1 </repeat>
          <repeat> x2 </repeat>
          <repeat> x3 </repeat>
          <more> etc </more>
     </item>

     <item iName="widget2">
          <title> Widget Two </title>
          <baseprice> 1500.00 </baseprice>
          <repeat> y1 </repeat>
          <repeat> y2 </repeat>
          <repeat> y3 </repeat>
          <more> data </more>
     </item>

     <item iName="widget3">
          <title> Widget Three </title>
          <baseprice> 300.00 </baseprice>
     </item>
</store>

and some javascript:

var widget2 = xmlDoc.getElementsByTagName("item")[1];

Can I do something like widget2.getElementsByTagName("repeat") in order to get a list of all the repeat tags within the widget2 tag? In the docs, I don't see any "getElementsByTagName" or similar function in the Node class. Does it only exist at the top level? How do I get a list of tags starting at a particular Node in the tree?
0
Melvinivitch
Asked:
Melvinivitch
  • 3
  • 2
  • 2
1 Solution
 
ozymandiasCommented:
xmlDoc.SelectNodes("store/item[@iName = 'widget2']/repeat");

This will return an XmlNodeList with all of the repeat nodes under the item with the iName of widget2.
0
 
Geert BormansInformation ArchitectCommented:
Hi Melvinivitch,

Here is what you could do

First you can use SelectNodes to address the node you want to select with XPath
That is a lot more straightforward then using getElementsByTagName.
If you are sure you only want one node instead of a nodelist,
you can use selectSingleNode

You can learn about XPath here
http://www.w3schools.com/xpath/default.asp

var itemNode=oXML.selectNodes("/store/item[@iName = 'widget2']/repeat");

After that you can loop over the nodes like this

                         for (j=0; j<itemNode.length; j++)
                              {
                                  test = test + (itemNode[j].nodeName);
                                  test = test + ("=");
                                  test = test + (itemNode.childNodes[0].nodeValue);
                                  test = test + ("<br />");
                              }          

In this example I write the repeat values in a test string, of course you can use them in your response
The result will be like this
        repeat = y1
        repeat = y2
        repeat = y3            

Cheers!

Geert
0
 
MelvinivitchAuthor Commented:
Thanks...

When I use that code: var itemNode=oXML.selectNodes("/store/item[@iName = 'widget2']/repeat");
where oXML is my toplevel xmlDoc object,
and then do: itemNode.childNodes[0].nodeName;
IE gives me this message: "childNodes.0 is null or not an object" ...

Thanks again...
0
What Kind of Coding Program is Right for You?

There are many ways to learn to code these days. From coding bootcamps like Flatiron School to online courses to totally free beginner resources. The best way to learn to code depends on many factors, but the most important one is you. See what course is best for you.

 
ozymandiasCommented:
I am guessing that this :

 test = test + (itemNode.childNodes[0].nodeValue);

should be :

 test = test + (itemNode.childNodes[j].nodeValue);
0
 
Geert BormansInformation ArchitectCommented:
no,
should be test = test + (itemNode[j].childNodes[0].nodeValue);

itemNode[j] is the jth <repeat> element (the jth element in your nodelist)

remeber from one of your previous questions:
childNodes[0].nodeValue is there to get at the text value

you are right, there was a bug in my code, but at a different locaton than you thought

To allign with your question
var itemNode=oXML.selectNodes("/store/item[@iName = 'widget2']/repeat");
should be
var itemNode=xmlDoc.selectNodes("/store/item[@iName = 'widget2']/repeat");

cheers

Geert


0
 
MelvinivitchAuthor Commented:
Thanks again.
0
 
Geert BormansInformation ArchitectCommented:
welcome
0
Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.

Join & Write a Comment

Featured Post

Get expert help—faster!

Need expert help—fast? Use the Help Bell for personalized assistance getting answers to your important questions.

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