Получить все текстовые узлы элемента, включая детей, используя HtmlAgilityPack в C #

.net .net-2.0 c# html-agility-pack xpath

Вопрос

Я пытаюсь получить все текстовые узлы элемента, включая его дочерние элементы, но по какой-то причине он дает мне весь документ HTML.

Вот что я придумал:

HtmlAgilityPack.HtmlNode el = htmlDoc.DocumentNode.SelectSingleNode("(//div[@class='TableContainer'])[" + index + "]");
if (el != null)
{
    foreach (HtmlNode node in el.SelectNodes("//text()"))
    {
        Debug.WriteLine("text=" + node.InnerText.Replace(" ", " "));
    }
}

Он напечатает text=line всего документа. Я уверен, что что-то не так с //text() , который является фрагментом, который я нашел здесь в SO, но я не знаю другого способа сделать это, и я с ним с ума сошел.

Принятый ответ

Вы должны использовать относительное выражение XPath, то есть относительно вашего контекстного узла el

HtmlAgilityPack.HtmlNode el = htmlDoc.DocumentNode.SelectSingleNode("(//div[@class='TableContainer'])[" + index + "]");
if (el != null)
{
    foreach (HtmlNode node in el.SelectNodes(".//text()"))
    {
        Debug.WriteLine("text=" + node.InnerText.Replace(" ", " "));
    }
}

"//text()" выберет все текстовые узлы потомка корневого узла документа

Подробнее см. В разделе « Пути местоположения» и « Сокращенный синтаксис» из спецификаций XPath.

  • //para выбирает всех потомков para корня документа и таким образом выбирает все элементы para в том же документе, что и контекстный узел

  • .//para выбирает потомки пара-элемента контекстного узла



Related

Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow
Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow