XML 和 HTML 表用 C# 解析

Posted

技术标签:

【中文标题】XML 和 HTML 表用 C# 解析【英文标题】:XML with HTML table to parse with C# 【发布时间】:2012-06-11 11:45:24 【问题描述】:

我正在关注一个 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 表格并将其声明为字符串变量,但我似乎无法拉出表格元素。以下是我的 hack,基于几个用户的建议:

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

【问题讨论】:

HTML Agility Pack 最适合用于来自未知来源且结构可能不完善的 HTML。看到您有 XML 并且嵌入的 HTML 表 也是格式良好的 XML,只需像您一样使用XmlDocument(或者如果可以的话,也可以使用XDocument)。 Oded,感谢您的回复。实际上我最初尝试过,但在几次尝试失败后,大量搜索将我引向了敏捷包。也就是说,如果您能指出一个仅使用 XmlDocument 的示例,因为我自己无法找到一个示例,我将不胜感激。 - 谢谢 【参考方案1】:

这对我有用,只要 Html 像 Xml 一样工作,它就会对你有用(并且值始终在 TD 内)。内部包含单个元素(也称为强元素)的 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);

【讨论】:

Chuck,这看起来很有希望。谢谢。我有机会让您完整发布代码吗?我是 XElement 的新手,“foreach”似乎不想使用它,所以我不确定如何打印出来。附言我尝试将此答案投票为有用,但恐怕我缺乏必要的代表点。

以上是关于XML 和 HTML 表用 C# 解析的主要内容,如果未能解决你的问题,请参考以下文章

C# 解析 Json数据

C# 解析XML

C# - 将 HTML 源解析为 XML

如何在 C# 摘要中包含 html 标记,以便将其作为文本处理(不解析为 XML)?

如何解析 HTML 或将 HTML 转换为 XML,以便我从网站中提取信息(在 C# 中)[重复]

C#解析JSON文件和XML文件(2021.05.26)