XPATH输入类型无线电不起作用c#

时间:2014-04-26 19:29:38

标签: c# html asp.net xpath html-agility-pack

这是我的代码

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 ..

谢谢

1 个答案:

答案 0 :(得分:0)

我的立场得到了纠正。如果SelectNodes无法找到任何节点,null会返回id

但您目击的行为与id属性无关(事实上,删除getInputSchedule[i].Remove(); 属性会导致异常更快),以及所有内容处理您的代码。

在你的内循环结束时,你正在这样做:

<input>

从HTML文档中删除input元素。

您的外部循环设置为执行四次,因此第二次执行时,doc.DocumentNode.SelectNodes("//table//input")元素已经消失,null返回input,这就是原因你的错误。

我不确定您为什么要在浏览文档时从文档中删除{{1}}元素,或者为什么要在整个文件中循环4次,但是希望能让你朝着正确的方向前进。