Получить HtmlAgilityPack Node с помощью точного поиска HTML или преобразования HTMLElement в HTMLNode

browser c# html-agility-pack

Вопрос

Я создал элемент выбора HTMLElement (DOM), используя по умолчанию .net WebBrowser. Пользователь может выбрать (выбрать) HTMLElement, щелкнув по нему.

Я хочу получить HtmlAgilityPack.HTMLNode, соответствующий HTMLElement.

Самый простой способ (на мой взгляд) - использовать doc.DocumentNode.SelectSingleNode (EXACTHTMLTEXT), но он действительно не работает (потому что функция принимает только код xpath).

Как я могу это сделать?

Пример HTMLElement, выбранный пользователем, выглядит следующим образом (код OuterHtml):

<a onmousedown="return wow" class="l" href="http://site.com"><em>Great!!!</em> <b>come and see more</b></a>

Конечно, любой элемент может быть выбран, поэтому мне нужен способ получить HTMLNode.

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

Такая же концепция, но немного проще, потому что вам не нужно знать тип элемента:

HtmlNode n = doc.DocumentNode.Descendants().Where(n => n.OuterHtml.Equals(text, StringComparison.InvariantCultureIgnoreCase)).FirstOrDefault();

Популярные ответы

Я придумал решение. Не знаю, лучший ли это (я был бы признателен, если кто-нибудь знает, как лучше это достичь, чтобы сообщить мне).

Вот класс, который получит HTMLNode:

public HtmlNode GetNode(string text)
        {

            if (text.StartsWith("<")) //get the type of the element (a, p, div etc..)
            {
                string type = "";
                for (int i = 1; i < text.Length; i++)
                {
                    if (text[i] == ' ')
                    {
                        type = text.Substring(1, i - 1);
                        break;
                    }
                }

                try //check to see if there are any nodes of your HTMLElement type that have an OuterHtml equal to the HtmlElement Outer HTML. If a node exist, than that's the node we want to use
                {
                    HtmlNode n = doc.DocumentNode.SelectNodes("//" + type).Where(x => x.OuterHtml == text).First();
                    return n;
                }
                catch (Exception)
                {
                    throw new Exception("Cannot find the HTML element in the HTML Page");
                }
            }
            else
            {
                throw new Exception("Invalid HTML Element supplied. The selected HTML element must start with <");
            }
        }

Идея состоит в том, что вы передаете OuterHtml элемента HtmlElement. Пример:

HtmlElement el=....
HtmlNode N = GetNode(el.OuterHtml);


Related

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