1

我用来HtmlAgilityPack从一个爱好项目的网站获取数据。我想从一个卖鞋的网站上得到鞋的货号。

但我的 linq 查询不返回字符串。相反,它返回类型:

System.Linq.Enumerable.WhereSelectEnumerableIterator<HtmlAgilityPack.HtmlNode,string>

如何让查询简单地返回一个字符串?

foreach (var node in query)
{
   Shoe shoe = new Shoe();

   var num = from x in node.Descendants()
             where x.Name == "img" && x.Attributes.Contains("class") && x.Attributes["class"].Value == "thumb lazy"
             select x.Attributes["title"].Value.Substring(11);

   shoe.articleNumber = Convert.ToInt32(num); //error

   shoes.Add(shoe);
}

错误: InvalidCastException 未处理。

无法将“WhereSelectEnumerableIterator`2[HtmlAgilityPack.HtmlNode,System.String]”类型的对象转换为“System.IConvertible”类型。

4

3 回答 3

8

您的 LINQ 查询返回一个集合。使用First///从集合中只获取一个FirstOrDefault元素SingleSingleOrDefault

var num = (from x in node.Descendants()
           where x.Name == "img" && x.Attributes.Contains("class") && x.Attributes["class"].Value == "thumb lazy"
           select x.Attributes["title"]).First().Value.Substring(11);
于 2013-09-18T14:03:52.023 回答
0

您的查询不会返回单个结果,而是返回结果列表。在您的情况下,这将是一个包含单个 id 的列表。您应该将其修改为:

var num = (from x in node.Descendants()
             where x.Name == "img" && x.Attributes.Contains("class") && x.Attributes["class"].Value == "thumb lazy"
             select x.Attributes["title"].Value.Substring(11)).FirstOrDefault();

这里的区别single, singleorDefault ,first ,FirstorDefault

于 2013-09-18T14:07:52.547 回答
0

假设只有一个条目与您的查询匹配,您只需将其修改为使用 FirstOrDefault() 或 First():

foreach (var node in query)
{
   Shoe shoe = new Shoe();

   var num = (from x in node.Descendants()
         where x.Name == "img" && x.Attributes.Contains("class") && x.Attributes["class"].Value == "thumb lazy"
         select x.Attributes["title"].Value.Substring(11)).First();

   shoe.articleNumber = Convert.ToInt32(num);

   shoes.Add(shoe);
}

请记住,如果该项目不存在,上述操作将失败并出现异常。

于 2013-09-18T14:06:35.750 回答