Избор на възел - два етикета дълбоко от текущия възел

Използвам HTML Agility Pack. Имам HTMLNode, който има следния InnerHtml:

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

От този възел искам да избера „Текст на връзката“ от тага „a“. Не успях да направя това. Опитах това:

System.Diagnostics.Debug.WriteLine(node.InnerHtml);
//The above line prints "Item: <b><a href="/bgitem.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, доколкото знам, ще работи само ако възелът е DocumentNode - person Xi Sigma; 01.04.2015
comment
Не е много ясно до сега. a и b са правилни XPath изрази, а ./a и a са еднакви в повечето контексти. //b избира b елемента от всяко място в документа, не само в малкия фрагмент, който OP показва. - person Mathias Müller; 01.04.2015