Xpath帮助 - 选择一个节点,然后选择子节点

时间:2014-01-27 02:04:30

标签: xpath

我很难理解为什么以及如何进行此查询。

我的html结构是这样的(嵌套在表格中的表格):

<root>
<table>
</table>
<table>
 <tr>
  <td>
   <table>
    <tr>
     <td></td>
     <td></td>
    </tr>
    <tr>
     <td></td>
     <td></td>
    </tr>
    <tr>
     <td></td>
     <td></td>
    </tr>
    <tr>
     <td></td>
     <td></td>
    </tr>
   </table>
  </td>
 </tr>
</table>
</root>

如果我开始像我的xpath那样:

var tables = blah.SelectNodes("//table");

返回3个父表,然后我想从第2个tr中选择td:

var td = tables[2].SelectNodes("//tr[2]/td");

但是,当我这样做时,它会回到父/ root,即“blah”级别。为什么会这样,我怎样才能继续过滤我的搜索结果?

注意:示例xml结构可能与写入的查询不直接匹配,只是试图给出一般概念......

1 个答案:

答案 0 :(得分:1)

继续扩展XPath

这个返回第二个表的<tr>个项目(其中四个):

/table/tr/td/table/tr

这个返回第二个<tr>项:

/table/tr/td/table/tr[2]

但最好的办法是为每个表提供单独的id属性,以便您可以使用该属性直接找到它。

使用类似的东西:

<root>
  <table id="1">
  </table>
  <table id="2">
    <tr>
      <td>
        <table id="3">
          <tr>
            <td></td>
            <td></td>
          </tr>
          <tr>
            <td></td>
            <td></td>
          </tr>
        </table>
      </td>
    </tr>
   </table>
</root>

您可以使用以下内容获取最里面的表中的项目:

//table[@id="3"]

您可以使用以下内容从最里面的表中获取单个<td>项目:

//table/tr/td/table/tr[2]/td[1]

分配id属性可让您更轻松一点(请注意第一个/tr/td后遗失的table项):

//table[@id="3"]/tr[2]/td[1]