1

を使用して、HTMLAgilityPackいくつかの html を解析しています。xpathクエリを linq クエリと組み合わせて使用​​するときに期待する結果セットを取得しています。両方を 1 つの LINQ クエリに結合する方法はありますか?

var test = doc.DocumentNode.SelectNodes("//div[@class='product']");

foreach (var item in test)
{

    var result = from input in item.Descendants("span")
                 where input.Attributes["class"].Value == "Bold"
                 where input.InnerHtml.ToUpper() == "GetItem"
                 select input;   

    return result;           
}
4

4 に答える 4

2

Linq で SelectMany を実行する別の方法をお見せしたかっただけです。これはスタイルの選択であり、SO の多くの人々は .SelectMany 拡張メソッドを好みます。Monad が IEnumerable にどのように適用されるかを確認できるからです。関数型プログラミングモデルが行う方法にはるかに近いため、私はこの方法を好みます。

return from product in doc.DocumentNode.SelectNodes("//div[@class='product']")
       from input in product.Descendants("span")
       where input.Attributes["class"].Value == "Bold"
       where input.InnerHtml.ToUpper() == "GetItem"
       select input;        
于 2013-03-30T16:22:32.893 に答える
2

すべてのスパンをまとめたい場合 (それがあなたが望むものであると仮定するのが正しければ)...

最初にそれをより流暢な表記法に変換します(SelectManyその方がはるかに理解しやすいと思いますが、それは私だけです)

(免責事項:私はこれをメモリから書いており、コードをコピー/貼り付けています-現時点ではVSではありません-確認する必要があります。問題がある場合は書き込みます-しかし、多かれ少なかれ大丈夫だと思います)

var test = doc.DocumentNode.SelectNodes("//div[@class='product']");
foreach(var item in test)
    item.Descendants("span").Where(input => input.Attributes["class"].Value == "Bold").Where(input => input.InnerHtml.ToUpper() == "GetItem").Select(input => input);

そして最後に...

var allSpans = doc.DocumentNode.SelectNodes("//div[@class='product']")
    .SelectMany(item => item.Descendants("span").Where(input => input.Attributes["class"].Value == "Bold").Where(input => input.InnerHtml.ToUpper() == "GetItem"));

...またはそれらの線に沿って

于 2013-03-30T16:07:08.403 に答える