解析单选按钮

时间:2014-02-23 12:50:35

标签: c# html-agility-pack

我在解析有值的单选按钮和跨度

上的innertext时遇到问题

Mark Up

<div id="First" class="Size-Inputs"> 
<input rel="8" type="radio" value="13051374" name="idProduct-13051359"/> <span rel="L">L</span>
<input rel="8" type="radio" value="13051373" name="idProduct-13051359"/> <span rel="M">M</span>
<input rel="8" type="radio" value="13051372" name="idProduct-13051359"/> <span rel="S">S</span>
<input rel="8" type="radio" value="13051375"name="idProduct-13051359"/> <span rel="XL">XL</span> </div>

我遇到的问题是,跨度名称一次只出现一个字母,即“L”。价值正常,但我无法弄清楚出了什么问题。

HtmlNodeCollection link = doc.DocumentNode.SelectNodes("//*[@id='First']/input");
//HtmlNodeCollection name = doc.DocumentNode.SelectNodes("//*[@id='First']/span");
if (link != null)
{
    foreach (HtmlNode item in link)
    {
        if (item != null)
        {
            string name = item.SelectSingleNode("//*[@id='First']/span").InnerText;
            string value = item.Attributes["value"].Value;
           Console.WriteLine(name);
           Console.WriteLine(value);
        }
    }
    Console.ReadLine();
}

我只是想知道是否有人可以给我任何建议如何使用一个Xpath然后循环遍历所有的单位名称和单选按钮的值。所以控制台打印出所有的跨度名称和值。感谢您提出的任何建议

2 个答案:

答案 0 :(得分:1)

您可以尝试这种方式:

HtmlNodeCollection link = doc.DocumentNode.SelectNodes("//*[@id='First']/span");
if (link != null)
{
    foreach (HtmlNode item in link)
    {
        string name = item.InnerText;
        string value = item.SelectSingleNode("./preceding-sibling::input[1]").Attributes["value"].Value;
        Console.WriteLine(name);
        Console.WriteLine(value);
    }
    Console.ReadLine();
}

基本上用于获取value的XPath语句意味着:选择直接在当前<input>元素的兄弟之前的<span>元素,然后获取它的value属性。其余的已经解释过here

答案 1 :(得分:0)

var links = htmlDoc.DocumentNode.SelectNodes("//*[@id='First']/input[@value]");
if (links != null)
{
    foreach (var link in links)
    {
        string value = link.Attributes["value"].Value;
         string name = null;
        var span = link.SelectSingleNode("following-sibling::span");
        if (span != null)
        {
            name = span.InnerText;
        }
         Console.WriteLine(name + " - " + value);
    }
}