2010-08-04 31 views
0

我有一個HTML文件中的數據,在表:拆分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]; 
+2

你剛纔寫一本關於解析HTML的問題和標記,'regex'?這會讓你陷入麻煩(http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags/1732454#1732454)。 – 2010-08-04 15:38:28

+1

如果困擾任何人,我可以刪除違規的正則表達式標籤。話雖如此,這不像我想要整個HTML標記集正則表達式。只有3種可能的東西需要匹配:'​​','​​'或''。我對正則表達式不太瞭解,但我很確定它可以在沒有世界結束的情況下滿足這個要求。 – fearofawhackplanet 2010-08-04 15:55:20

回答

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上有很多例子。

+0

很酷,我不知道string.Split可能需要一個數組,所以這足以爲我解決它。謝謝 – fearofawhackplanet 2010-08-04 16:00:44

2

你可以嘗試:

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

但是這取決於如何HTML經常是。它是以編程方式生成的,還是由人類編寫的?您應該只使用正則表達式,如果您確定它始終以相同的方式生成,否則您應該使用正確的HTML解析器。

2

如果你的HTML是結構良好的,你可以使用LINQ到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] 
}