C# 获取HTML表特定行中的单元格

C# 获取HTML表特定行中的单元格,c#,html,pattern-matching,C#,Html,Pattern Matching,我正在开发一个C#控制台应用程序。最终的目标是在表中找到一个特定的行,然后单击链接下载由旧web应用程序生成的文件。(这已经很旧了,所以没有API供我使用) 该表的结构如下: <html> <head> <title>Test Table Page</title> </head> <body> <table border="1" cellpadding="3" cellspacing="5">

我正在开发一个C#控制台应用程序。最终的目标是在表中找到一个特定的行,然后单击链接下载由旧web应用程序生成的文件。(这已经很旧了,所以没有API供我使用)

该表的结构如下:

<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>

测试表页
测试行1
测试内容
测试行2
测试内容
测试行三
测试内容


我想做的是获取与测试第二行相关联的测试内容。我需要在相邻单元格中输入报告的名称。

如果您认为HTML将与XML兼容,您可以使用如下XML解析器(使用XPath)。就我个人而言,我喜欢避免使用HTML解析器,因为它们又大又复杂。就像用电锯把树枝劈成两半。有时候,别的什么都不行,但如果有更简单的解决方案,那就先试试

相关代码片段:

完整源代码:

使用系统;
使用System.Collections.Generic;
使用System.Linq;
使用系统文本;
使用System.Xml;
使用System.Xml.Linq;
使用System.Xml.XPath;
命名空间XmlSandbox{
班级计划{
静态void Main(字符串[]参数){
字符串l_xmlLiteral=
“\n”+
“\n”+
“测试表页\n”+
“\n”+
“\n”+
“\n”+
“\n”+
“测试第一行\n”+
“测试内容\n”+
“\n”+
“\n”+
“测试第二行\n”+
“测试内容\n”+
“\n”+
“\n”+
“测试第三行\n”+
“测试内容\n”+
“\n”+
“\n”+
“\n”+
"";
var l_document=XDocument.Parse(l_xmlLiteral);
var l_navigator=l_document.CreateNavigator();
var l_contentCell=l_navigator.SelectSingleNode(//td[前面的同级::td/text()='testrow Two']);
Console.WriteLine(l_contentCell.Value);
}
}
}

如果您认为HTML将与XML兼容,您可以使用如下XML解析器(使用XPath)。就我个人而言,我喜欢避免使用HTML解析器,因为它们又大又复杂。就像用电锯把树枝劈成两半。有时候,别的什么都不行,但如果有更简单的解决方案,那就先试试

相关代码片段:

完整源代码:

使用系统;
使用System.Collections.Generic;
使用System.Linq;
使用系统文本;
使用System.Xml;
使用System.Xml.Linq;
使用System.Xml.XPath;
命名空间XmlSandbox{
班级计划{
静态void Main(字符串[]参数){
字符串l_xmlLiteral=
“\n”+
“\n”+
“测试表页\n”+
“\n”+
“\n”+
“\n”+
“\n”+
“测试第一行\n”+
“测试内容\n”+
“\n”+
“\n”+
“测试第二行\n”+
“测试内容\n”+
“\n”+
“\n”+
“测试第三行\n”+
“测试内容\n”+
“\n”+
“\n”+
“\n”+
"";
var l_document=XDocument.Parse(l_xmlLiteral);
var l_navigator=l_document.CreateNavigator();
var l_contentCell=l_navigator.SelectSingleNode(//td[前面的同级::td/text()='testrow Two']);
Console.WriteLine(l_contentCell.Value);
}
}
}

如果您要任意搜索,我强烈建议您使用HTML解析器。@David-谢谢您的建议。我已经下载了HTML Agility Pack,它似乎满足了我的需要。如果你想随意搜索,我强烈推荐一个HTML解析器。@David-谢谢你的建议。我已经下载了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 );

        }
    }
}