1

abc以下のコードを使用して、コード内のクラス名を検索していHTMLます。

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

それは私に正しい結果を与えています。

IDしかし、Classの代わりにnameを検索したい場合abc、上記のコードは機能しません。

たぶん私が使用しているコードには@classワードが含まれているため、ID名では機能しません。

同じコードを使用して「クラス」と「ID」の両方の名前を検索する方法はありますか?

4

1 に答える 1

0

まず第一に、IDとは異なりidます。HTMLでは大文字と小文字が区別されませんが、XMLでは大文字と小文字が区別されます。の作者であるSimonMourierからのこの回答を見てください。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 に答える