2012-09-12 143 views
1

我正在研究C#控制檯應用程序。最終目標是在表格中找到特定的行,然後單擊鏈接以下載舊Web應用程序生成的文件。 (這是很老,所以沒有API,我使用)在HTML表格的特定行中獲取單元格

表所示的結構如下:

<html> 
<head> 
    <title>Test Table Page</title> 
</head> 
<body> 
    <table border="1" cellpadding="3" cellspacing="5"> 
     <tr> 
      <td>Test Row One</td> 
      <td>Test Content</td> 
     </tr> 
     <tr> 
      <td>Test Row Two</td> 
      <td>Test Content</td> 
     </tr> 
     <tr> 
      <td>Test Row Three</td> 
      <td>Test Content</td> 
     </tr> 
    </table> 
</body> 

我想要做的就是與相關的測試內容測試行二。我需要在鄰近的單元格中顯示報告的名稱。

+2

我強烈推薦一個HTML解析器,如果你要可以任意搜索。 –

+0

@David - 感謝您的建議。我已經下載了HTML敏捷包,它似乎正在做我所需要的。 – Tim

回答

1

如果您認爲HTML將符合XML標準,那麼您可以使用下面的XML解析器(使用XPath)。 個人而言,我喜歡避免使用HTML解析器,因爲它們大而複雜。就像使用電鋸將一根樹枝對摺一樣。有時候,沒有別的辦法可以做,但如果有更簡單的解決方案,那就先試試。

相關代碼段:

var l_contentCell = l_navigator.SelectSingleNode("//td[preceding-sibling::td/text()='Test Row Two']"); 

完整的源代碼:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Xml; 
using System.Xml.Linq; 
using System.Xml.XPath; 

namespace XmlSandbox { 
    class Program { 
     static void Main(string[] args) { 

      string l_xmlLiteral = 
       "<html>\n" + 
       " <head>\n" + 
       "  <title>Test Table Page</title>\n" + 
       " </head>\n" + 
       " <body>\n" + 
       "  <table border=\"1\" cellpadding=\"3\" cellspacing=\"5\">\n" + 
       "   <tr>\n" + 
       "    <td>Test Row One</td>\n" + 
       "    <td>Test Content</td>\n" + 
       "   </tr>\n" + 
       "   <tr>\n" + 
       "    <td>Test Row Two</td>\n" + 
       "    <td>Test Content</td>\n" + 
       "   </tr>\n" + 
       "   <tr>\n" + 
       "    <td>Test Row Three</td>\n" + 
       "    <td>Test Content</td>\n" + 
       "   </tr>\n" + 
       "  </table>\n" + 
       " </body>\n" + 
       "</html>"; 

      var l_document = XDocument.Parse(l_xmlLiteral); 
      var l_navigator = l_document.CreateNavigator(); 

      var l_contentCell = l_navigator.SelectSingleNode("//td[preceding-sibling::td/text()='Test Row Two']"); 

      Console.WriteLine(l_contentCell.Value); 

     } 
    } 
} 
相關問題