我正在使用以下代码将HTML解析为数组。
void client_DownloadStringCompleted(object sender, DownloadStringCompletedEventArgs e)
{
var html = e.Result;
var doc = new HtmlDocument();
doc.LoadHtml(html);
var list = doc.DocumentNode.Descendants("div").ToList();
var node = doc.DocumentNode.Descendants("table")
.FirstOrDefault(x => x.Id == "departures")
.Element("tbody") .Elements("tr")
.Select(tr => tr.Elements("td")
.Select(td => td.InnerText).ToArray()).ToArray();
然后用下面的代码输出到Texblock。
//first line
textBlock1.Text = node[0][0];
textBlock2.Text = node[0][1];
textBlock3.Text = node[0][2];
//Second line
textBlock4.Text = node[1][0];
textBlock5.Text = node[1][1];
textBlock6.Text = node[1][2];
//Third line
textBlock7.Text = node[2][0];
textBlock8.Text = node[2][1];
textBlock9.Text = node[2][2];
我的问题是:HTMl每天都在变化,所以有时没有[2],有时多达[12]。
我想知道的是如何编写一个条件语句来检查数组是否存在,并且只在它有值时输出。
我已经尝试了下面的条件语句,但是当没有任何节点[2]或节点[1]结果时,它仍然显示一个未处理的异常
if (node[2][0].length > 0)
{
textBlock1.Text = node[2][0];
}
任何帮助将不胜感激。如果你需要澄清这一点,请告诉我。
为避免无效索引,必须确保所有尺寸,例如
if (node.length > 2 && node[2].length > 0) {
// Okay to use node[2][0]
// Since && is short-circuiting it will never make second
// check if first fails.
}
对我来说,一个更根本的问题似乎是文本框不是可变的,而是固定的(box1, box2等)。考虑使用不同的控件,也许是各种类型的列表控件。然后可以统一地添加n
项(并且只使用循环结构,而不需要第一次索引检查)。文本框也可以动态创建,但这不是我的首选。
快乐编码。