Solved

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

Posted on 2006-11-14
7
273 Views
Last Modified: 2008-02-01
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
Comment
Question by:Melvinivitch
  • 3
  • 2
  • 2
7 Comments
 
LVL 15

Expert Comment

by:ozymandias
ID: 17937175
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
 
LVL 60

Expert Comment

by:Geert Bormans
ID: 17937238
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
 

Author Comment

by:Melvinivitch
ID: 17937371
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
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.

 
LVL 15

Expert Comment

by:ozymandias
ID: 17937514
I am guessing that this :

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

should be :

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

Accepted Solution

by:
Geert Bormans earned 325 total points
ID: 17937538
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
 

Author Comment

by:Melvinivitch
ID: 17940441
Thanks again.
0
 
LVL 60

Expert Comment

by:Geert Bormans
ID: 17940532
welcome
0

Featured Post

3 Use Cases for Connected Systems

Our Dev teams are like yours. They’re continually cranking out code for new features/bugs fixes, testing, deploying, testing some more, responding to production monitoring events and more. It’s complex. So, we thought you’d like to see what’s working for us.

Question has a verified solution.

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

Introduction In my previous article (http://www.experts-exchange.com/Microsoft/Development/MS-SQL-Server/SSIS/A_9150-Loading-XML-Using-SSIS.html) I showed you how the XML Source component can be used to load XML files into a SQL Server database, us…
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, …
This video shows how to quickly and easily add an email signature for all users on Exchange 2016. The resulting signature is applied on a server level by Exchange Online. The email signature template has been downloaded from: www.mail-signatures…
A short tutorial showing how to set up an email signature in Outlook on the Web (previously known as OWA). For free email signatures designs, visit https://www.mail-signatures.com/articles/signature-templates/?sts=6651 If you want to manage em…

770 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