0

我有一个 html 文件中的数据,在一个表中:

<table>
    <tr><td>001</td><td>MC Hammer</td><td>Can't Touch This</td></tr>
    <tr><td>002</td><td>Tone Loc</td><td>Funky Cold Medina</td></tr>
    <tr><td>003</td><td>Funkdoobiest</td><td>Bow Wow Wow</td></tr>
</table>

如何将单行拆分为数组或列表?

string row = streamReader.ReadLine();

List<string> data = row.Split //... how do I do this bit?

string artist = data[1];
4

4 回答 4

4

简短的回答:永远不要尝试使用正则表达式解析 HTML。它很可能会回来困扰你。

更长的答案:只要您可以绝对肯定地保证您正在解析的 HTML 符合给定的结构,您可以按照 Jenni 的建议使用 string.Split()。

string html = "<tr><td>001</td><td>MC Hammer</td><td>Can't Touch This</td></tr>";

string[] values = html.Split(new string[] { "<tr>","</tr>","<td>","</td>" }, StringSplitOptions.RemoveEmptyEntries);

List<string> list = new List<string>(values);

单独列出标签可以使这稍微更具可读性,并且.RemoveEmptyEntries可以防止您在相邻的结束标签和开始标签之间的列表中获得空字符串。

如果这个 HTML 来自野外,或者来自一个可能会改变的工具 - 换句话说,如果这不仅仅是一次性交易 - 我强烈建议您改用HTML Agility Pack之类的东西。它很容易集成,Intarwebs 上有很多示例。

于 2010-08-04T15:46:13.757 回答
3

如果您的 HTML 格式正确,您可以使用 LINQ to XML:

string input = @"<table>
    <tr><td>001</td><td>MC Hammer</td><td>Can't Touch This</td></tr>
    <tr><td>002</td><td>Tone Loc</td><td>Funky Cold Medina</td></tr>
    <tr><td>003</td><td>Funkdoobiest</td><td>Bow Wow Wow</td></tr>
</table>";

var xml = XElement.Parse(input);

// query each row
foreach (var row in xml.Elements("tr"))
{
    foreach (var item in row.Elements("td"))
    {
        Console.WriteLine(item.Value);
    }
    Console.WriteLine();
}

// if you really need a string array...
var query = xml.Elements("tr")
               .Select(row => row.Elements("td")
                                 .Select(item => item.Value)
                                 .ToArray());

foreach (var item in query)
{
    // foreach over item content
    // or access via item[0...n]
}
于 2010-08-04T16:11:12.057 回答
2

在解析 HTML 时,我通常会使用HTML Agility Pack

于 2010-08-04T15:38:44.817 回答
2

你可以试试:

Row.Split /<tr><td>|<\/td><td>|<\/td><\/tr>/

但这取决于 HTML 的规则性。它是以编程方式生成的,还是人工编写的?如果你确定它总是以相同的方式生成,你应该只使用正则表达式,否则你应该使用适当的 HTML 解析器

于 2010-08-04T15:39:23.927 回答