1

我正在使用下面的代码来搜索代码中的类abcHTML

nodes = doc.DocumentNode.SelectNodes("//*[contains(concat(' ', normalize-space(@class), ' '), ' abc ')]");

这给了我正确的结果。

但是如果我想搜索ID名称abc而不是类,上面的代码不起作用。

也许我正在使用的代码包含@class 字,因此它不适用于 ID 名称。

有没有办法使用相同的代码同时搜索“类”和“ID”名称?

4

1 回答 1

0

首先,ID不同于id. HTML 不区分大小写,但 XML 区分大小写。看看的作者Simon Mourier的回答HtmlAgilityPack

也就是说,当你使用它的 XPATH 特性时,你必须使用小写的标签。这意味着“//body”表达式将匹配 BODY、Body 和 body,而“//BODY”将不匹配任何内容。

同样代表ID.

关于过滤器逻辑,您必须使用Logical-and运算符

var nodes = doc.DocumentNode.SelectNodes(
    "//*[contains(concat(' ', normalize-space(@class), ' '), ' abc ')"+
        " and " +
        "contains(concat(' ', normalize-space(@id), ' '), ' div1 ')]");

或者,更简单:

var nodes = doc.DocumentNode.SelectNodes("//*[@class=\"abc\" and @id=\"div1\"]");

但作为个人喜好,如果上下文允许,我LINQ会这样做:

var nodes = doc.DocumentNode.Descendants()
    .Where(i => 
        i.Attributes["class"] != null 
        && i.Id != null 
        && i.Attributes["class"].Value == "abc" 
        && i.Id == "div1");
于 2013-01-30T14:34:25.677 回答