Ask Ben: Selecting XML Nodes That Have A Given Parent Node Using XPath

Posted May 5, 2009 at 10:44 AM

Tags: ColdFusion, Ask Ben

Let's say I have an XML file with the following data in it: [private information]. Right now, the way the component parses the XML file, it returns all instances of DUNS it finds. Is there any way to limit the tag that is searches through and only return say the DUNS from the BasicInfo parent tag? If so, can you provide an example on how that might be done? Thanks again!

When you search for nodes in a given XML document by name (ex. //name), it will return nodes anywhere in that XML document with the matching name. This is what you are experiencing. If you want to return only nodes within a given parent node, then you just have to be a little bit more specific in you XPath. There are two ways to do this:

  1. Specify the parent node in the node path.
  2. Specify the parent node in the target node predicate.

Before we get into those two options, let's first build ourselves a test ColdFusion XML document:

 Launch code in new window » Download code as text file »

  • <!--- Generate ColdFusion XML document. --->
  • <cfxml variable="xmlData">
  •  
  • <category>
  • <name>Bodybuilding Books</name>
  •  
  • <books>
  • <book>
  • <name>Muscle: Confessions Of An Unlikely Bodybuilder</name>
  • <author>Samuel Wilson Fussell</author>
  • </book>
  • <book>
  • <name>Gorilla Suit: My Adventures In Bodybuilding</name>
  • <author>Bob Paris</author>
  • </book>
  • </books>
  • </category>
  •  
  • </cfxml>

In this demo XML document, you can see that we have three "name" nodes: one for the Category and one for each Book node. Like you have experienced, if we searched for:

 Launch code in new window » Download code as text file »

  • <!--- Query for all names. --->
  • <cfset arrNameNodes = XmlSearch(
  • xmlData,
  • "//name"
  • ) />
  •  
  • <!--- Output resultant node set. --->
  • <cfdump
  • var="#arrNameNodes#"
  • label="//name"
  • />

... we'd get back all three:

 
 
 
 
 
 
XPath That Found Any Name Node Within The Given XML Document. 
 
 
 

But, if we want to only get back the Name nodes contained within the Book nodes, we have to use one of the two XPath options above. We can specify the parent node in the node search path:

 Launch code in new window » Download code as text file »

  • <!---
  • Query for all name nodes that are contained within a
  • book node.
  • --->
  • <cfset arrNameNodes = XmlSearch(
  • xmlData,
  • "//book/name"
  • ) />

This will search for Name nodes that are contained within book nodes:

 
 
 
 
 
 
XPath That Found Name Nodes Contained Within Book Nodes Within The Given XML Document. 
 
 
 

We can also search for all Name nodes and then specify in the predicate that it must have a Book parent node:

 Launch code in new window » Download code as text file »

  • <!---
  • Query for all name nodes that are children of
  • the parent node: book.
  • --->
  • <cfset arrNameNodes = XmlSearch(
  • xmlData,
  • "//name[ parent::book ]"
  • ) />

This will search for all Name nodes and then filter the node set based on the parent node of the given node. Running the above code gives us the same node set as above.

Either of these methods will return only the two Name nodes contained within the Book nodes. The former, however, is probably faster as you limit your search earlier on in the XPath; but, I have not done any performance testing on this.

Download Code Snippet ZIP File

Post Comment  |  Ask Ben  |  Permalink  |  Other Searches  |  Print Page




Learning ColdFusion 9 - ColdFusion 9 tutorials, samples, examples, demos

Reader Comments

There are no comments posted for this web log entry.


Post Comment  |  Ask Ben

Recent Blog Comments
Jill
Nov 7, 2009 at 11:40 AM
How To Unformat Your Code (Like A Pro)
Derek, I think you might be right - sweet! Thanks for the link :) ... read »
Nov 7, 2009 at 11:25 AM
How To Unformat Your Code (Like A Pro)
I think it would be way easier to just use this http://www.logichammer.com/html-formatter/ He just released v3 and it rocks. ... read »
Jill
Nov 7, 2009 at 7:58 AM
How To Unformat Your Code (Like A Pro)
LMAO - this was pretty funny! I have to admit - I also love to reformat code so I can read it. My boss used to tell me to leave my OCD at home. Now I don't feel so bad after reading everyone else' ... read »
Nov 6, 2009 at 10:10 PM
How To Unformat Your Code (Like A Pro)
The timing of this post is just uncanny. I spent the last 15-20 minutes manually un-formatting my "Ben Nadel" style code within a CFC of mine. I was really digging the readability a few weeks ago, bu ... read »
Roe
Nov 6, 2009 at 5:11 PM
Passing Arrays By Reference In ColdFusion - SWEEET!
ArraySort also reorders the results of these java obj's ... read »
Nov 6, 2009 at 4:53 PM
How To Unformat Your Code (Like A Pro)
I tried to go *back* the other way. Adding formatting is actually a much more complicated problem than removing formatting. Anyway, here is what I could put together with a minimal amount of time: ... read »
Asaf
Nov 6, 2009 at 2:35 PM
ColdFusion GetPageContext() Massive Exploration
Hi, I actually found this post useful. I recently acquired a SSL certificate for my website and when I switched over to HTTPS Internet Explorer would throw an error when trying to download a dynamic ... read »
Nov 6, 2009 at 2:19 PM
How To Unformat Your Code (Like A Pro)
@Chuck, @Nathan, Well, now I feel like it's a challenge.... I accept. ... read »