使用C#解析包含HTML表格的XML

3

我正在关注一个RSS订阅源,它返回一个XML。在XML中有HTML表格,以一个长字符串的形式返回。我正在尝试使用C#访问这个HTML表格的元素,以便我可以将这些元素用作另一个程序的变量。以下是一个表格示例:

<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 Agility Pack最适合用于来自未知来源且可能结构不良的HTML。考虑到您已经具备XML,嵌入式HTML表格也是格式良好的XML,因此只需像以前一样使用XmlDocument(或者如果可以的话,使用XDocument)即可。 - Oded
Oded,感谢您的回复。实际上我最初尝试了那个方法,但是经过多次失败的尝试后,我通过大量搜索找到了Agility Pack。话虽如此,如果您能指向一个仅使用XmlDocument的示例,因为我自己找不到,我将非常感激。-谢谢 - user1442073
1个回答

2

这对我有用,只要Html作为Xml工作,它也适用于您(并且值始终在TD内)。 带有单个元素(也就是strong)的TD的值与该元素的值相同。

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
Chuck,这看起来非常有前途。谢谢。我有没有机会让你发布完整的代码?我对XElement是全新的,“foreach”似乎不想与它一起工作,所以我不确定如何将其打印出来。附言:我尝试将此答案标记为有用,但恐怕我缺少必要的声望点数。 - user1442073

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接