On Fri, November 20, 2009 12:29, Aaron Patterson wrote:
>
> How about this?
>
>> require "nokogiri"
=> []
>> doc = Nokogiri::HTML(<<-ENDDOC)
<table>
<thead></thead>
<tfoot></tfoot>
<tbody>
<tr>
<td class="username">xyz</td>
<td class="rolename">ABC</td>
</tr>
<tr>
<td class="username">pqr</td>
<td class="rolename">ABC</td>
</tr>
<tr>
<td class="username">lmn</td>
<td class="rolename">DEF</td>
</tr>
</tbody>
</table>
ENDDOC
=> #<Nokogiri::HTML::Document:0x15b49ebdff20 name="document"
children=[#<Nokogiri::XML::DTD:0x15b49ebdc85c name="html">,
#<Nokogiri::XML::Element:0x15b49ebdc5dc name="html"
children=[#<Nokogiri::XML::Element:0x15b49ebd7028 name="body"
children=[#<Nokogiri::XML::Element:0x15b49ebd4d14 name="table"
children=[#<Nokogiri::XML::Element:0x15b49ebd3b30 name="thead">,
#<Nokogiri::XML::Element:0x15b49ebd3798 name="tfoot">,
#<Nokogiri::XML::Element:0x15b49ebd2c80 name="tbody"
children=[#<Nokogiri::XML::Element:0x15b49ebd145c name="tr"
children=[#<Nokogiri::XML::Element:0x15b49ebd08cc name="td"
attributes=[#<Nokogiri::XML::Attr:0x15b49ebcfad0 name="class"
value="username">] children=[#<Nokogiri::XML::Text:0x15b49ebcf260
"xyz">]>, #<Nokogiri::XML::Text:0x15b49ebcf094 "\n ">,
#<Nokogiri::XML::Element:0x15b49ebcf030 name="td"
attributes=[#<Nokogiri::XML::Attr:0x15b49ebce284 name="class"
value="rolename">] children=[#<Nokogiri::XML::Text:0x15b49ebcc6c8
"ABC">]>, #<Nokogiri::XML::Text:0x15b49ebcc344 "\n ">]>,
#<Nokogiri::XML::Element:0x15b49ebc9838 name="tr"
children=[#<Nokogiri::XML::Element:0x15b49ebc8ac8 name="td"
attributes=[#<Nokogiri::XML::Attr:0x15b49ebc899c name="class"
value="username">] children=[#<Nokogiri::XML::Text:0x15b49ebc6a0c
"pqr">]>, #<Nokogiri::XML::Text:0x15b49ebc574c "\n ">,
#<Nokogiri::XML::Element:0x15b49ebc47ac name="td"
attributes=[#<Nokogiri::XML::Attr:0x15b49ebc3d98 name="class"
value="rolename">] children=[#<Nokogiri::XML::Text:0x15b49ebbd09c
"ABC">]>, #<Nokogiri::XML::Text:0x15b49ebbc9f8 "\n ">]>,
#<Nokogiri::XML::Element:0x15b49ebbc804 name="tr"
children=[#<Nokogiri::XML::Element:0x15b49ebbbc9c name="td"
attributes=[#<Nokogiri::XML::Attr:0x15b49ebbb9cc name="class"
value="username">] children=[#<Nokogiri::XML::Text:0x15b49ebb9f50
"lmn">]>, #<Nokogiri::XML::Text:0x15b49ebb9398 "\n ">,
#<Nokogiri::XML::Element:0x15b49ebb9334 name="td"
attributes=[#<Nokogiri::XML::Attr:0x15b49ebb91b8 name="class"
value="rolename">] children=[#<Nokogiri::XML::Text:0x15b49ebb8510
"DEF">]>, #<Nokogiri::XML::Text:0x15b49ebb83a8 "\n ">]>]>]>]>]>]>
>>
?> uname = "xyz"
=> "xyz"
>> rname = "ABC"
=> "ABC"
>>
?> cnode = "//*[contains(.,'#{uname}') and " +
?> "following-sibling::*[contains(.,'#{rname}')]]"
=> "//*[contains(.,'xyz') and following-sibling::*[contains(.,'ABC')]]"
>>
?> p doc.xpath(cnode).length
2
=> nil
>> p doc.xpath(cnode)
[#<Nokogiri::XML::Element:0x15b49ebd145c name="tr"
children=[#<Nokogiri::XML::Element:0x15b49ebd08cc name="td"
attributes=[#<Nokogiri::XML::Attr:0x15b49ebcfad0 name="class"
value="username">] children=[#<Nokogiri::XML::Text:0x15b49ebcf260
"xyz">]>, #<Nokogiri::XML::Text:0x15b49ebcf094 "\n ">,
#<Nokogiri::XML::Element:0x15b49ebcf030 name="td"
attributes=[#<Nokogiri::XML::Attr:0x15b49ebce284 name="class"
value="rolename">] children=[#<Nokogiri::XML::Text:0x15b49ebcc6c8
"ABC">]>, #<Nokogiri::XML::Text:0x15b49ebcc344 "\n ">]>,
#<Nokogiri::XML::Element:0x15b49ebd08cc name="td"
attributes=[#<Nokogiri::XML::Attr:0x15b49ebcfad0 name="class"
value="username">] children=[#<Nokogiri::XML::Text:0x15b49ebcf260
"xyz">]>]
=> nil
At least this does not throw a syntax error. But now I am confused
as to what it is doing. The node length reported is 2, which I
infer from the content displayed refers to the number of occurrences
of
... name="class" value="username">] children
[#<Nokogiri::XML::Text:0x15b49ebcf260 "xyz" ...
But I am looking for pairs of uname + rname. Whatever XPath
expression I end up with, with this source document I would expect
to see a value of 1 instead of 2.
Help?