2014-10-03 97 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")) 
... 

對於任何有問題的人,請嘗試通過將特定標籤推送到更廣泛的選擇來將您的搜索移到更廣泛的選擇。