[lnkForumImage]
TotalShareware - Download Free Software

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


 

Forums >

comp.lang.ruby

REXML XPath bug?

Andy Watts

5/14/2008 8:01:00 PM

I'm having trouble with a particular XPATH in REXML and would greatly
appreciate any help.

Given this simple document..
<body>
<div class="summary">xxx</div>
<div>
<span>yyy</span>
</div>
</body>

The xpath "//div[@class='summary']/following-sibling::div/span" is
failing to return '<span>yyy</span>'.


Here's a console dump that also shows a simplier xpath working.

>> REXML::XPath.match(doc, "//div[@class='summary']/following-sibling::div/span").to_s
=> ""
>> REXML::XPath.match(doc, "//div[@class='summary']/following-sibling::div").to_s
=> "<div>\n<span>yyy</span>\n</div>"
>> puts doc.to_s
<body>
<div class='summary'>xxx</div>
<div>
<span>yyy</span>
</div>
</body>

The xpath works fine in firefox's xpath checker, so it seems like an
issue with rexml.
Any help greatly appreciated.

- Andy
--
Posted via http://www.ruby-....

1 Answer

Casimir

5/17/2008 9:37:00 AM

0

On Wed, 14 May 2008 15:00:47 -0500, Andy Watts wrote:

> I'm having trouble with a particular XPATH in REXML and would greatly
> appreciate any help.
(rest of it quoted below)

Ok, I tested this with JEdits XPATH tool and indeed, the xpath "//div
[@class='summary']/following-sibling::div" returns the span-element with
string-value yyy, xml fragment <span>yyy</span>.

Is it a bug? I must admit I would need to read more references etc before
being able to say definately - or is it just different interpretation of
the following-sibling -axis. Dont have the time to see the rfc atm.

But I played around a bit:
irb(main):046:0> puts root.elements["//div[@class='summary']/following-
sibling::div/span"]
nil
* So, it doesnt work like that.

irb(main):047:0> puts root.elements["//div[@class='summary']/following-
sibling::div"]
<div>
<span>yyy</span>
</div>
* hmm....

irb(main):049:0> puts root.elements["//div[@class='summary']/
following::div/span"]
<span>yyy</span>
** Would this work in your case?

ALSO - you could include the rexml namespace by adding the line
include REXML
after the rexml requires. This way you wont have to use the long ::-
syntax, but can refer to document or elements directly, and use xpaths
simply as above inside [""].

I also played around with this http://www.zvon.org:9001/saxo...
XLab/XML/xpatut_15.html and following seems to accomplish what you need.

Finally, just plain-jane /div/span would select the span but maybe there
can be many and you only want the one after the summary div.

Out of time, gtg

Casimir Pohjanraito

> Given this simple document..
> <body>
> <div class="summary">xxx</div>
> <div>
> <span>yyy</span>
> </div>
> </body>
>
> The xpath "//div[@class='summary']/following-sibling::div/span" is
> failing to return '<span>yyy</span>'.
>
>
> Here's a console dump that also shows a simplier xpath working.
>
>>> REXML::XPath.match(doc,
>>> "//div[@class='summary']/following-sibling::div/span").to_s
> => ""
>>> REXML::XPath.match(doc,
>>> "//div[@class='summary']/following-sibling::div").to_s
> => "<div>\n<span>yyy</span>\n</div>"
>>> puts doc.to_s
> <body>
> <div class='summary'>xxx</div>
> <div>
> <span>yyy</span>
> </div>
> </body>
>
> The xpath works fine in firefox's xpath checker, so it seems like an
> issue with rexml.
> Any help greatly appreciated.
>
> - Andy