2

Web ページで特定のアイテムを探しています。私が(これまでのところテストのために)行ったことは問題なく機能していますが、私の目には本当に醜いです。これをより簡潔な方法で行うための提案を得たいと思います。つまり、2 つではなく 1 つの Linq クエリです....

        document.GetXDocument();
        string xmlns = "{http://www.w3.org/1999/xhtml}";
        var AllElements = from AnyElement in document.fullPage.Descendants(xmlns + "div")
                          where AnyElement.Attribute("id") != null && AnyElement.Attribute("id").Value == "maincolumn"
                          select AnyElement;
        // this first query bring only one LARGE Element.

        XDocument subdocument = new XDocument(AllElements);

        var myElements = from item in subdocument.Descendants(xmlns + "img")
                         where String.IsNullOrEmpty(item.Attribute("src").Value.Trim()) != true
                         select item;

        foreach (var element in myElements)
        {   
            Console.WriteLine(element.Attribute("src").Value.Trim());                                                          
        }
        Assert.IsNotNull(myElements.Count());

「img」を直接検索できることはわかっていますが、リンクやテキストなど、それらのページで他の種類のアイテムを取得できるようにしたいと考えています。

これが最善の方法であると強く疑います!

4

2 に答える 2

0

単一のクエリで同じロジック:

var myElements = from element in document.fullPage.Descendants(xmlns + "div")
                          where element.Attribute("id") != null 
                          && element.Attribute("id").Value == "maincolumn"
                          from item in new XDocument(element).Descendants(xmlns + "img")
                          where !String.IsNullOrEmpty(item.Attribute("src").Value.Trim()) 
                          select item;
于 2012-11-01T18:13:52.050 に答える
0

Web ページを XML として解析したい場合は、次のようにしてください。

var elements =
    from element in document.Descendants(xmlns + "div")
    where (string)element.Attribute("id") == "maincolumn"
    from element2 in element.Descendants(xmlns + "img")
    let src = ((string)element2.Attribute("src")).Trim()
    where String.IsNullOrEmpty(src)
        select new {
            element2,
            src
    };

foreach (var item in elements) {
    Console.WriteLine(item.src);
}

ノート:

  • の型はdocument何ですか? 私はそれがXDocument. その場合は、 でDescendants直接使用できますXDocument。(OTOTHdocumentが の場合XDocument、そのfullPathプロパティはどこから来るのですか?)
  • を文字列にキャストしXAttributeます。空の場合、キャストの結果は null になります。これにより、ダブルチェックが節約されます。(これはパフォーマンス上の利点を提供しません。)
  • 後で再利用letするために値を「保存」するために使用します。この場合は foreach で使用します。最終的な Assert だけが必要な場合を除き、その場合AnyCount. Any値を返すために最初の結果を繰り返すだけです。Countそれらすべてを反復する必要があります。
  • なぜsubdocumentタイプXDocumentですか?XElementぴったりのタイプではないでしょうか。
  • を使用して、 の代わりに のString.IsNullOrWhitespace空白をチェックすることもできます。これは、 をそのまま処理したい場合に、含まれている可能性のある空白を使用することを前提としています。srcString.IsNullOrEmptysrc
于 2012-11-01T18:37:26.283 に答える