【问题标题】:XPATH Input Type Radio doesn't work c#XPATH 输入类型 Radio 不起作用 c#
【发布时间】:2014-04-27 04:15:29
【问题描述】:

这是我的代码

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("&lt;table&gt;&lt;tr&gt;&lt;td&gt;&lt;p&gt;&lt;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~\"&gt;Rp.445,000 ( N/Cls;4 )&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;");

一切正常。 为什么 ID 属性会导致我的 XPath 失败?

请..帮助..

谢谢

【问题讨论】:

  • 什么是doc?我们可以开始猜测,但如果您能再帮助我们一点,那就太好了。
  • HtmlDocument doc = new HtmlDocument();@PatrickHofman
  • 您的 HTML 格式错误。你在&lt;/td&gt; 标签之前有&lt;/tr&gt; 标签,而它们应该是相反的。如果你修复这些会发生什么?
  • 当我尝试运行它时,您的原始代码可以很好地选择节点。这真的是你的实际代码吗?
  • 我的错误,我已经编辑了代码,但仍然为空..&lt;table&gt;&lt;tr&gt;&lt;td&gt;&lt;p&gt;&lt;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~\"&gt;Rp.445,000 ( N/Cls;4 )&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;@JLRishe 请帮助..

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


【解决方案1】:

我的立场是正确的。如果找不到任何节点,SelectNodes 会返回 null

但是您目睹的行为与id 属性无关(实际上,删除id 属性会导致异常发生更快),而一切都与您的代码。

在内循环结束时,您正在执行以下操作:

getInputSchedule[i].Remove();

从 HTML 文档中删除 &lt;input&gt; 元素。

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

我不确定您为什么要在浏览文档时从文档中删除 input 元素,或者为什么要循环整个内容 4 次,但希望这能让您正确方向。

【讨论】:

  • 哦,我明白了,但是如何删除当前元素(这意味着只输入我循环,而不是全部)?我想一个一个地删除输入元素,所以我认为getInputSchedule[i].Remove(); 删除了一个元素,而不是全部..
  • 为什么我要删除getInputSchedule[i].Remove();,因为假设我有两个元素,所以我想删除我通过循环过程访问的输入元素..我可以一个一个删除循环过程?谢谢你..
  • 如果您正在循环访问它们,[i] 不应该允许您一次访问每一个吗?我仍然看不到删除它们的理由。如果您只是看看如果您不使用 Remove() 行会发生什么情况如何?
  • 哦,我知道了,现在我的代码可以正常工作了..谢谢@JLRishe 的时间,当然你节省了我的时间..再次感谢..
  • @IgiShellshock 太棒了。如果我的帖子解决了您的问题,您能否将其标记为已接受(使用复选标记图标)?
猜你喜欢
  • 2014-08-14
  • 2016-07-14
  • 2015-08-01
  • 2013-07-23
  • 1970-01-01
  • 1970-01-01
  • 2012-09-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多