Выбор узла — два тега вглубь от текущего узла

Я использую HTML Agility Pack. У меня есть HTMLNode со следующим InnerHtml:

"Item: <b><a href="item.htm">Link Text</a></b>"

Из этого узла я хочу выбрать «Текст ссылки» из тега «а». Я не смог этого сделать. Я пробовал это:

System.Diagnostics.Debug.WriteLine(node.InnerHtml);
//The above line prints "Item: <b><a href="item.htm">Link Text</a></b>"
HtmlNode boldTag = node.SelectSingleNode("b");
if (boldTags != null)
{
    HtmlNode linkTag = boldTag.SelectSingleNode("a");
    //This is always null!
    if (linkTag != null)
    {
        return linkTag.InnerHtml;           
    }
}

Будем признательны за любую помощь в правильном выборе.


person Camille Sévigny    schedule 01.04.2015    source источник


Ответы (1)


SelectSingleNode ожидает XPath

Итак, вам нужно

 var b = htmlDoc.DocumentNode.SelectSingleNode("//b");
 var a = b.SelectSingleNode("./a");
 var text = a.InnerText;

в одну строку

var text =  htmlDoc.DocumentNode.SelectSingleNode("//b/a").InnerText;

Обратите внимание, что в начале xpath

  • // будет искать в любом месте DocumentNode
  • .// будем искать потомка текущего узла
  • / будет искать дочерний элемент DocumentNode
  • ./ будет искать дочерний элемент текущего узла
person Xi Sigma    schedule 01.04.2015
comment
@CamilleSévigny, насколько я знаю, это будет работать, только если node является DocumentNode - person Xi Sigma; 01.04.2015
comment
Пока не очень понятно. a и b являются правильными выражениями XPath, а ./a и a одинаковы в большинстве контекстов. //b выбирает b элементов из любого места документа, а не только из небольшого фрагмента, который показывает OP. - person Mathias Müller; 01.04.2015