在XPath跟随兄弟之后使用绝对路径

时间:2014-10-17 15:45:36

标签: html xpath

我正在使用以下XPath搜索:

getNodeSet(doc, "//img[@src = './images/min_es.gif']/../../following-sibling::tr")

结果是<tr>包含两个表(一个在另一个中),所以:

<tr valign="top"><td height="163">&#13;
    <table width="128" border="0" cellspacing="0" cellpadding="0" height="163"><tr valign="top"><td width="96">&#13;
          <table width="126"><tr><td width="65%" valign="top"><font size="1" face="Arial, Helvetica, sans-serif">&#13;
                                   Microclina</font></td>&#13;
                                 <td width="35%" valign="top"><font size="1" face="Arial, Helvetica, sans-serif">&#13;
                                   ~40 %</font></td>&#13;
                               </tr><tr><td width="65%" valign="top"><font size="1" face="Arial, Helvetica, sans-serif">&#13;
                                   Quartzo</font></td>&#13;
                                 <td width="35%" valign="top"><font size="1" face="Arial, Helvetica, sans-serif">&#13;
                                   ~29 %</font></td>&#13;
                               </tr><tr><td width="65%" valign="top"><font size="1" face="Arial, Helvetica, sans-serif">&#13;
                                   Plagioclase</font></td>&#13;
                                 <td width="35%" valign="top"><font size="1" face="Arial, Helvetica, sans-serif">&#13;
                                   ~20 %</font></td>&#13;
                               </tr><tr><td width="65%" valign="top"><font size="1" face="Arial, Helvetica, sans-serif">&#13;
                                   Biotite</font></td>&#13;
                                 <td width="35%" valign="top"><font size="1" face="Arial, Helvetica, sans-serif">&#13;
                                   ~10 %</font></td>&#13;
                               </tr></table></td>&#13;
      </tr></table></td>&#13;
</tr> 

现在我想访问内部表。要做到这一点,我尝试过:

getNodeSet(doc, "//img[@src = './images/min_es.gif']/../../following-sibling::tr//table")

给出了所有表的列表(在这种情况下是上面的两个表,其中一个表有两个表)。

我也尝试过:

 getNodeSet(doc, "//img[@src = './images/min_es.gif']/../../following-sibling::tr//table/table")

这对我一无所获。我尝试了很多这样的变化:

getNodeSet(doc, "//img[@src = './images/min_es.gif']/../../following-sibling::tr[1]/.//table/table")

但我无法进入难以捉摸的内心表。

谁能告诉我怎么样?任何参考文献赞赏。

2 个答案:

答案 0 :(得分:1)

这里的问题是,当你似乎不明白它的作用时,你会随意地投掷//

path//table

表示“在tables下方选择所有path。这就是为什么在您尝试时选择所有表格的原因。您应该使用的是:

//img[@src = './images/min_es.gif']/../../following-sibling::tr/table/tr/td/table

//img[@src = './images/min_es.gif']/../../following-sibling::tr/table//table

第一个意味着:

//img[@src = './images/min_es.gif']/../../following-sibling::tr

选择tr

/table

选择table的所有tr个孩子。

/tr

选择tr个孩子的任何table

/td

选择td个孩子的任何tr

/table

选择table个孩子的任何td

在第二个例子中,我们有:

/table

选择table所选的任何tr个孩子。

//table

选择任何低于table的任何表格。

答案 1 :(得分:0)

我已经解决了这个问题。好像我还没有完全理解XPath。解决方案是

`getNodeSet(doc, "//img[@src = './images/min_es.gif']/../../following-sibling::tr//table//table")`

每当查询返回一个或多个元素时,您必须使用&#34; //&#34;在答案集上匹配。