2012-08-27 44 views
3

嘗試分析基於示例表在這個崗位HTML Agility pack - parsing tablesHtmlAgilityPack的XPath錯誤

我碰到一些很奇怪的問題,當我試圖解析使用C#+ XNA和HtmlAgilityPack網頁,但是。這裏是我的代碼稍加修改形成其他職位:

foreach (HtmlNode table in doc.DocumentNode.SelectNodes("//table")) 
{ 
    spriteBatch.DrawString(font, table.Id, new Vector2(0, num * 16), Color.Black); 
    num++; 
    foreach (HtmlNode row in table.SelectNodes("tr")) 
    { 
     spriteBatch.DrawString(font, "row", new Vector2(0, num * 16), Color.Black); 
     num++; 
     foreach (HtmlNode cell in row.SelectNodes("th|td")) 
     { 
      spriteBatch.DrawString(font, "cell: " + cell.InnerText, new Vector2(0, num * 16), Color.Black); 
     } 
    } 

} 

然而,當我擊中我得到一個奇怪的錯誤,我把我的問題的截圖在這裏斷點的第一行: http://i.imgur.com/JxzJ9.png

然而如果我刪除了斷點,那麼當我點擊第二個foreach循環時,我會得到一個NullReferenceException錯誤。我假設我沒有用XPath返回任何實際的表,但第一個錯誤令我困惑。如果這只是一個Xpath問題,我會花更多的時間來試圖瞭解如何使用它。

這裏的網頁我試圖解析:

<div class="page"> 
    <header> 

     <nav> 
      <ul id="menu"> 
       <li><a href="/">Home</a></li> 
       <li><a href="/Home/About">About</a></li> 
       <li><a href="/Score">Scoreboard</a></li> 
      </ul> 
     </nav> 
    </header> 
    <section id="main"> 

<h2>High Scores</h2> 
<div id="grid"> 
<table class="grid"> 
<thead> 
<tr class="head"> 
<th scope="col"> 
    <a href="/Score?sort=Name&amp;sortdir=ASC">Name</a> 
</th> 

<th scope="col"> 
    <a href="/Score?sort=Points&amp;sortdir=DESC">Points</a> 
</th> 

<th scope="col"> 
    <a href="/Score?sort=Date&amp;sortdir=ASC">Date</a> 
</th> 
</tr> 
</thead> 

<tbody> 
<tr> 
    <td>sec_goat</td> 
    <td>10</td> 
    <td>9/8/1980 12:00:00 AM</td> 
</tr> 

<tr class="alt"> 
    <td>tankorsmash</td> 
    <td>100</td> 
    <td>10/10/2010 12:00:00 AM</td> 
</tr> 

<tr> 
    <td>sec_goat</td> 
    <td>1000</td> 
    <td>8/12/2012 12:00:00 AM</td> 
</tr> 

<tr class="alt"> 
    <td>tankorsmash</td> 
    <td>10000</td> 
    <td>12/12/2012 12:00:00 AM</td> 
</tr> 

<tr> 
    <td>sec_goat</td> 
    <td>100000</td> 
    <td>1/1/2013 12:00:00 AM</td> 
</tr> 

<tr class="alt"> 
    <td>tankorsmash</td> 
    <td>1000000</td> 
    <td>9/18/2012 12:00:00 AM</td> 
</tr> 

<tr> 
    <td>bob</td> 
    <td>99999999</td> 
    <td>9/8/1980 12:00:00 AM</td> 
</tr> 

+0

我相當確定這是我的XPath術語的問題。我使用[這篇文章](http://stackoverflow.com/questions/3369294/html-agility-pack-loop-through-rows-and-columns)的路徑抓取錶行和列,它按預期工作。 –

+0

我已經意識到我在屏幕截圖中獲得的奇怪錯誤與調試有關,當我嘗試進入XPath邏輯時出現錯誤。仍然不知道如何解決這個問題,但它是這樣的。 –

回答

0

如果使用下面的代碼,它按預期工作:

var doc = new HtmlDocument(); 
doc.LoadHtml(HTML); 
foreach (HtmlNode table in doc.DocumentNode.SelectNodes("//table")) 
{ 
    foreach (HtmlNode row in table.SelectNodes("//tr")) 
    { 
     foreach (HtmlNode cell in row.SelectNodes("th|td")) 
     { 
      //don't use .ChildNodes[1] in real code, only works for <th>. 
      Debug.WriteLine(cell.ChildNodes[1].InnerHtml); 
     } 
    } 
} 

正如你所看到的,我將XPath語句從「tr」更改爲「// tr」。如果您有興趣更熟悉XPath語法,我會向您推薦此頁:http://www.w3schools.com/xpath/xpath_syntax.asp