这是我的代码
private DataTable ParseTable(string html)
{
HtmlDocument doc = new HtmlDocument();
DataTable dt = new DataTable();
String[] datasc;
String[] valueTemp = new String[30];
int index;
doc.LoadHtml("<table><tr><td><p><input id=\"ControlGroupScheduleSelectView_AvailabilityInputScheduleSelectView_RadioButtonMkt1Fare7\" type=\"radio\" name=\"ControlGroupScheduleSelectView$AvailabilityInputScheduleSelectView$market1\" value=\"0~N~~N~RGFR~~1~X|QG~ 885~ ~~BTH~05/19/2014 07:00~KNO~05/19/2014 08:20~\" />Rp.445,000 ( N/Cls;4 )</p></td></tr></table>");
for (int z = 0; z < 4; z++)
{
var getInputSchedule = doc.DocumentNode.SelectNodes("//table//input");
datasc = new String[getInputSchedule.Count];
for (int i = 0; i < getInputSchedule.Count; i = i+1)
{
string removeClassFare = string.Empty;
String[] selectValueSplit = getInputSchedule[i].Attributes["value"].Value.Split('|');
valueTemp[i] = selectValueSplit[1];
String[] getAlphaSC = selectValueSplit[0].Split('~');
try
{
index = getInputSchedule[i].ParentNode.InnerText.IndexOf("(");
if (index != -1)
{
removeClassFare = getInputSchedule[i].ParentNode.InnerText.Substring(0, index);
removeClassFare = System.Text.Encoding.ASCII.GetString(System.Text.Encoding.ASCII.GetBytes(removeClassFare)).Replace("??", "").Replace("Rp.", "").Trim();
}
}
catch (Exception e) {
//removeClassFare = getInputSchedule[i].ParentNode.InnerText;
}
if (!dt.Columns.Contains(getAlphaSC[1]))
{
dt.Columns.Add(getAlphaSC[1], typeof(string));
}
if (i == 0)
{
datasc[i] = "<div align=\"center\"><input <input onclick='faredetail(this.value, this.name)' id=\"" + getInputSchedule[i].Attributes["id"].Value + "\" type=\"radio\" value=\"" + getInputSchedule[i].Attributes["value"].Value + "\" name=\"" + getInputSchedule[i].Attributes["name"].Value + "\"><br>" + removeClassFare + "</div>";
}
else
{
if (selectValueSplit[1].Equals(valueTemp[i - 1],StringComparison.Ordinal))
{
datasc[i] = "<div align=\"center\"><input <input onclick='faredetail(this.value, this.name)' id=\"" + getInputSchedule[i].Attributes["id"].Value + "\" type=\"radio\" value=\"" + getInputSchedule[i].Attributes["value"].Value + "\" name=\"" + getInputSchedule[i].Attributes["name"].Value + "\"><br>" + removeClassFare + "</div>";
}
else
{
break;
}
}
getInputSchedule[i].Remove();
}
datasc = datasc.Where(x => !string.IsNullOrEmpty(x)).ToArray();
dt.Rows.Add(datasc);
}
return dt;
}
如果我运行,错误消息“对象引用未设置为对象的实例。”,但如果我删除元素的ID,如
doc.LoadHtml("<table><tr><td><p><input type=\"radio\" name=\"ControlGroupScheduleSelectView$AvailabilityInputScheduleSelectView$market1\" value=\"0~N~~N~RGFR~~1~X|QG~ 885~ ~~BTH~05/19/2014 07:00~KNO~05/19/2014 08:20~\">Rp.445,000 ( N/Cls;4 )</p></td></tr></table>");
一切正常。 为什么ID属性会导致我的XPath失败?
pleasee..help ..
谢谢
答案 0 :(得分:0)
我的立场得到了纠正。如果SelectNodes
无法找到任何节点,null
会返回id
。
但您目击的行为与id
属性无关(事实上,删除getInputSchedule[i].Remove();
属性会导致异常更快),以及所有内容处理您的代码。
在你的内循环结束时,你正在这样做:
<input>
从HTML文档中删除input
元素。
您的外部循环设置为执行四次,因此第二次执行时,doc.DocumentNode.SelectNodes("//table//input")
元素已经消失,null
返回input
,这就是原因你的错误。
我不确定您为什么要在浏览文档时从文档中删除{{1}}元素,或者为什么要在整个文件中循环4次,但是希望能让你朝着正确的方向前进。