2010-08-04 5 views
0

J'ai données dans un fichier html, dans un tableau:ligne html Divisé en tableau de chaînes

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

Comment puis-je diviser une seule ligne dans un tableau ou d'une liste?

string row = streamReader.ReadLine(); 

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

string artist = data[1]; 
+2

vous ai écrit juste une question au sujet de l'analyse syntaxique HTML et la balise 'il regex'? Cela va vous mettre en difficulté (http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags/1732454#1732454). –

+1

Je peux supprimer le tag regex incriminé s'il dérange quelqu'un. Cela dit, ce n'est pas comme si j'essayais de regex l'ensemble du jeu de balises html. Il y a seulement 3 choses possibles à faire correspondre: '', '' ou ''. Je ne sais pas grand-chose sur regex, mais je suis sûr qu'il peut faire face à cette exigence sans la fin du monde. – fearofawhackplanet

Répondre

4

Courte réponse: N'essayez jamais d'analyser HTML de façon sauvage avec des expressions régulières. Il reviendra très probablement vous hanter. Réponse plus longue: Réponse plus longue: Tant que vous pouvez absolument garantir que le HTML que vous analysez correspond à la structure donnée, vous pouvez utiliser string.Split() comme suggéré par Jenni.

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

Listing des balises maintient indépendamment cette légèrement plus lisible, et la .RemoveEmptyEntries vous gardera d'obtenir une chaîne vide dans votre liste entre les balises de fermeture et d'ouverture adjacentes.

Si ce code HTML provient de la nature, ou d'un outil qui peut changer - autrement dit, si cela est plus qu'une transaction unique - je fortement vous encourager à utiliser quelque chose comme le HTML Agility Pack à la place. C'est assez facile à intégrer, et il y a beaucoup d'exemples sur les Intarwebs.

+0

Cool, je ne connaissais pas string.Split pourrait prendre un tableau, donc c'est assez pour le résoudre pour moi. Merci – fearofawhackplanet

2

Vous pouvez essayer:

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

Mais cela dépend de la façon régulière le code HTML est. Est-il généré par programme, ou un humain l'écrit-il? Vous ne devez utiliser une expression régulière que si vous êtes sûr qu'elle sera toujours générée de la même manière, sinon vous devriez utiliser un analyseur HTML approprié

2

Si votre code HTML est bien formé, vous pouvez utiliser LINQ pour 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] 
}