2012-09-12 90 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); 

     } 
    } 
} 
相关问题