2

我正在寻找网页上的特定项目。我所做的(测试,到目前为止)工作得很好,但对我来说真的很难看。我想以更简洁的方式获得建议,即现在是 ONE Linq 查询而不是 2 ....

        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

如果您坚持将网页解析为 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直接使用 on XDocumentdocument(如果是OTOTH XDocument,那么该fullPath属性从何而来?)
  • XAttribute转换为字符串。如果它为空,则强制转换的结果将为空。这将节省双重检查。(这不会提供任何性能优势。)
  • 用于let“保存”一个值以供以后重用,在这种情况下用于 foreach。除非您只需要最后的 Assert,否则在这种情况下,使用Any而不是Count. Any只需遍历第一个结果即可返回值;Count必须遍历所有这些。
  • 为什么是subdocument类型XDocument?不是XElement合适的类型吗?
  • 您还可以使用String.IsNullOrWhitespace来检查 中的空格src,而不是String.IsNullOrEmpty,假设您要按src原样处理它可能具有的任何空格。
于 2012-11-01T18:37:26.283 回答
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 回答