getting XPath in REXML to dive deeper

P

Peter Bailey

Hello,
I'm finally using REXML instead of plain vanilla Ruby to convert XML
data. I've learned a bit about XPath and how REXML can use it. I've got
a sample XML file whose root element is <registration>. Underneath that
element are a bunch of children elements. So, when I do the instruction
listed below, I get all of them. But, I don't get the last two elements
that, to me anyway, are children, too. The only thing different about
them is that they have children, too. Does anyone know the nomenclature
for getting ALL of the children of an element, not just those that are
immediate children. I guess I want grandkids, too!

XPath.each(doc, "//registration/*") { |element| puts element.text }

Thanks,
Peter
 
G

Gavin Kistner

Peter said:
I'm finally using REXML instead of plain vanilla Ruby to convert XML
data. I've learned a bit about XPath and how REXML can use it. I've got
a sample XML file whose root element is <registration>. Underneath that
element are a bunch of children elements. So, when I do the instruction
listed below, I get all of them. But, I don't get the last two elements
that, to me anyway, are children, too. The only thing different about
them is that they have children, too. Does anyone know the nomenclature
for getting ALL of the children of an element, not just those that are
immediate children. I guess I want grandkids, too!

XPath.each(doc, "//registration/*") { |element| puts element.text }

The term you are looking for is 'descendants'. In XPath, '/' is
shorthand for the 'child' axis. You want the 'descendant' axis, which
has the shorthand (that you already used) of '//'.

So "//registration//*" is "At any level, find an element named
'registration', and then find every element below any of them."

You possible want "registration//*" which is "every element in the
entire XML file at every level except for the root node", but that seems
rather pointless. (Why have a hierarchy in the XML if you're throwing
away the meaning?) Perhaps that will work for you, or perhaps you should
think further about exactly what elements you really want to traverse.

Hope that helps (oh, and this has nothing to do with Ruby, BTW :p)
Gavin
 
P

Peter Bailey

Gavin said:
The term you are looking for is 'descendants'. In XPath, '/' is
shorthand for the 'child' axis. You want the 'descendant' axis, which
has the shorthand (that you already used) of '//'.

So "//registration//*" is "At any level, find an element named
'registration', and then find every element below any of them."

You possible want "registration//*" which is "every element in the
entire XML file at every level except for the root node", but that seems
rather pointless. (Why have a hierarchy in the XML if you're throwing
away the meaning?) Perhaps that will work for you, or perhaps you should
think further about exactly what elements you really want to traverse.

Hope that helps (oh, and this has nothing to do with Ruby, BTW :p)
Gavin

Yes, this helps. Thanks, Gavin. What I did, to get everything I needed
was this:

XPath.each(doc, "//registration//*") { |element| puts element.text }

I just put in a second "/" after registration. That picked up ALL of the
descendants, and the grand-child elements, or, whatever they're called.
My only problem is that the output is kind of spacey, with a lot more
white space before those grand-child elements. -Peter
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,764
Messages
2,569,566
Members
45,041
Latest member
RomeoFarnh

Latest Threads

Top