2014-10-03 99 views
0

我当前的HTML布局麻烦选择节点

<table> //table[1] 
</table> 
<table> //table[2] 
<tbody> 
    <tr> 
     <td> 
     <p> 
      &nbsp; 
     </p> 
     </td> 
    </tr> 
    <tr> 
     <td> 
     <table> //table[1]//table[1] 
      <tbody> 
       <tr> 
        <td> 
        <p> 
         INFO 1 
        </p> 
        </td> 
        <td> 
        <p> 
         INFO 2 
        </p> 
        </td> 
        <td> 
        <p> 
         INFO 3 
        </p> 
        </td> 
        <td> 
        <p> 
         INFO 4 
        </p> 
        </td> 
       </tr> 
      </tbody> 
     </table> 
     </td> 
    </tr> 
    <tr> 
     <td> 
     <table> //table[1]//table[2] 
      <tbody> 
       <tr> 
        <td> 
        <p><strong>Name</strong></p> 
        </td> 
        <td> 
        <p><strong>Quantity</strong></p> 
        </td> 
       </tr> 
       <tr> 
        <td> 
        <p>Apples </p> 
        </td> 
        <td>10</td> 
       </tr> 
      </tbody> 
     </table> 
     </td> 
    </tr> 
    <tr> 
     <td> 
     <table> //table[1]//table[3] 
     </table> 
     </td> 
    </tr> 
</tbody> 
</table> 

我试图内//table[1]//table[2]获取数据,但我不断收到以下空HtmlNode(System.NullReferenceException):

不”工作:doc.DocumentNode.SelectSingleNode("//table[2]//tbody//tr//td//table[2]//tbody//tr");

我不知道为什么发生这种情况,当我试图让数据//table[1]//table[1]它工作得很好,这种SYNT斧头

作品:doc.DocumentNode.SelectSingleNode("//table[2]//tbody//tr//td//table[1]//tbody//tr");

我误解索引如何使用HTML敏捷性包工程?

回答

1

//table[2]返回第二内<table>元件相同的父因为在XPath中:

的([])具有比(///)更高的优先级(优先级)。 [For Reference]

在你的情况下,仅存在一个<table>在每个<td>,因此XPath表达式返回任何内容。一个可能的解决方案是将括号改变优先级:

(//table[2]//tbody//tr//td//table)[2]//tbody//tr 

以上的Xpath得到所有<table>第二<table>元S通过内部的XPath //table[2]//tbody//tr//td//table返回。然后从那个<table>,继续返回后代//tbody//tr元素。

0

我最终不得不基于这个tr不知道为什么我的另一种方式不起作用,但这种方式确实有效。

我基本上把我的索引移动到了我的表格的上一级。因此,在第一个tbody之后,每个表格都在tr/td声明中,而我只是构建了我的HtmlNode以索引tr的索引。如果你扩大选择过程,也许敏捷包效果更好? IDK。

反正...

对于table[2]//table[1]我用:

HtmlNode table = doc.DocumentNode.SelectSingleNode("//table[2]//tbody//tr[2]//table"); 
foreach (var cell in table.SelectNodes(".//tr//td/p")) 
... 

我选择TR [2]我有一个TR,如果你注意上面的示例HTML/TD用一个空格前

对于table[2]//table[2]我用

HtmlNode table = doc.DocumentNode.SelectSingleNode("//table[2]//tbody//tr[3]//table[1]"); 
foreach (var cell in table.SelectNodes(".//tr//td")) 
... 

对于任何有问题的人,请尝试通过将特定标签推送到更广泛的选择来将您的搜索移到更广泛的选择。