Разбить строку html на массив строк - PullRequest
0 голосов
/ 04 августа 2010

У меня есть данные в 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 голосов
/ 04 августа 2010

Краткий ответ: Никогда не пытайтесь анализировать HTML из дикой природы с помощью регулярных выражений.Скорее всего, он вернется, чтобы преследовать вас.

Более длинный ответ: Если вы абсолютно уверены, что HTML-код, который вы анализируете, соответствует данной структуре, вы можете использовать строку.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.

3 голосов
/ 04 августа 2010

Если ваш 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]
}
2 голосов
/ 04 августа 2010

Вы можете попробовать:

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

Но это зависит от того, насколько регулярным является HTML. Это сгенерировано программно, или человек пишет? Регулярное выражение следует использовать только в том случае, если вы уверены, что оно всегда будет генерироваться одинаково, в противном случае следует использовать правильный анализатор HTML

2 голосов
/ 04 августа 2010

При разборе HTML я обычно обращаюсь к HTML Agility Pack .

...