2013-03-01 7 views
0

Я использую HtmlAgilityPack, чтобы попытаться найти HTML «A» узлы, которые имеют HREF атрибут, который содержит определенную строку, в моем случае строка «/ группы /»:XPath HTML нахождение узлов

HtmlNodeCollection groups = source.DocumentNode.SelectNodes("//a[contains(@href, '/groups/')]"); 

Хотя исходный код содержит около 20 таких узлов, которые мой код выше возвращает никому, что заставляет меня поверить, что я делаю это неправильно.

Это то, что я делаю правильно, и если нет, то как я могу выбрать узлы с определенным атрибутом, который имеет значение, содержащее определенную строку?

+0

Пожалуйста, добавьте XML вы ориентируетесь – JWiley

ответ

0

Ваше выражение кажется правильным, как для меня.

Вы не публикуете исходный документ (или, по крайней мере, его часть). Итак, я буду гадать.

Дело в том, что xpath не крут для нечувствительного к регистру сравнения. Если у вас есть тег <a> с атрибутом href, который содержит, например, /Groups/ или /GROUPS/, он не будет соответствовать. Существует workaround для этого:

//a[contains(translate(@href, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz'), '/groups/')]

В качестве другого варианта можно использовать LINQ с StringComparison.OrdinalIgnoreCase:

source.DocumentNode.Descendants("a") 
    .Where(a => a.GetAttributeValue("href", string.Empty) 
        .IndexOf("/groups/", StringComparison.OrdinalIgnoreCase) != -1 
);