[lnkForumImage]
TotalShareware - Download Free Software

Confronta i prezzi di migliaia di prodotti.
Asp Forum
 Home | Login | Register | Search 


 

Forums >

comp.lang.ruby

getting XPath in REXML to dive deeper

Peter Bailey

9/24/2007 7:28:00 PM

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
--
Posted via http://www.ruby-....

2 Answers

Phrogz

9/24/2007 7:35:00 PM

0

Peter Bailey wrote:
> 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
--
Posted via http://www.ruby-....

Peter Bailey

9/24/2007 8:01:00 PM

0

Gavin Kistner wrote:
> Peter Bailey wrote:
>> 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

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
--
Posted via http://www.ruby-....