2012-06-07 33 views
3

我正在關注一個RSS源,它返回一個XML。 XML內部是HTML表格,作爲一個長字符串返回。我試圖用C#訪問這個HTML表格的元素,以便我可以將這些元素中的每一個用作另一個程序的變量。一個表格的例子:XML與HTML表格解析C#

<table cellpadding="5"><tr><td><strong>Date (GMT)</strong></td><td><strong>Event</strong></td><td><strong>Cons.</strong></td><td><strong>Actual</strong></td><td><strong>Previous</strong></td></tr><tr><td>Jun 7 11:00</td><td>Announcement</td><td>6.250 %</td><td>6.310 %</td><td>6.560 %</td></tr></table> 

幾乎所有類似的線程都在這裏提示HtmlAgilityPack,我正在嘗試使用。到目前爲止,我已經能夠拉出HTML表格並將其聲明爲一個字符串變量,但我似乎無法拉出表格元素。以下是我的黑客,根據幾個用戶的建議:

XmlDocument xDoc = new XmlDocument(); 
xDoc.Load("http://rssfeed.com"); 
string descr = xDoc.SelectSingleNode("rss/channel/item/description").InnerText; 

HtmlAgilityPack.HtmlDocument doc = new HtmlAgilityPack.HtmlDocument(); 
doc.LoadHtml("descr"); 
// A Print statement here (textBox1.Text = descr;) shows that I'm successfully accessing the HTML table 
var table = doc.DocumentNode.Descendants("tr") 
.Select(n => n.Elements("td").Select(o => o.InnerText).ToArray()); 

foreach (var tr in table) 
{ 
textBox1.Text = String.Format("{0} {1} {2}", tr[0], tr[1], tr[2]); 
} 

任何和所有的建議是非常受歡迎的。

感謝, d

+3

的HTML敏捷性包最好來自未知源的用於HTML和可能不結構良好。看到你有XML並且嵌入式HTML表格也很好地形成了XML,就像你一樣使用'XmlDocument'(或者如果可以的話''也許''XDocument')。 – Oded

+0

Oded,謝謝你的回覆。我實際上嘗試過,但是在幾次失敗的嘗試之後,大量的搜索將我帶到了Agility Pack。也就是說,如果你可以用XmlDocument指向一個例子,因爲我一直無法自己找到一個例子,所以我將不勝感激。 - 謝謝 – user1442073

回答

2

這個工作對我來說,只要在HTML工作爲XML它會爲你(和值始終是一個TD內)。內部具有單個元素的TD(又名strong)的值與該元素的值相同。

XElement table = XElement.Parse("<table cellpadding=\"5\"><tr><td><strong>Date (GMT)</strong></td><td><strong>Event</strong></td><td><strong>Cons.</strong></td><td><strong>Actual</strong></td><td><strong>Previous</strong></td></tr><tr><td>Jun 7 11:00</td><td>Announcement</td><td>6.250 %</td><td>6.310 %</td><td>6.560 %</td></tr></table>"); 
string[] values = table.Descendants("td").Select(td => td.Value).ToArray(); 

和/或與值陣列的行:

var rows = table.Elements() 
    .Select(tr => tr.Elements().Select(td => td.Value).ToArray()) 
    .ToList(); 

更新:

foreach (string value in values) 
    Console.WriteLine(value); 

foreach (string[] row in rows) 
    foreach (string value in row) 
     Console.WriteLine(value); 
+1

查克,這看起來非常有前途。謝謝。任何機會我可以讓你發佈整個代碼?我是XElement的全新人物,「foreach」似乎不想使用它,所以我不知道如何打印出來。 P.S.我嘗試投票這個答案是有用的,但我恐怕缺乏必要的代表點。 – user1442073

+0

@ user1442073我添加了一個循環來顯示值。 –