cómo convertir Htmlnode de HtmlAgilityPack a webbrowser HtmlElement

c# html-agility-pack

Pregunta

Estaba creando una aplicación que inserta automáticamente datos en las etiquetas de entrada html. Tengo xPath para una etiqueta específica como '/ html / body / form / div / div [2] / div / div / input' y logré obtener HtmlNode con la ayuda de HtmlAgilityPack

var documentAsIHtmlDocument3 = (mshtml.IHTMLDocument3)webBrowser.Document.DomDocument;
StringReader sr = new StringReader(documentAsIHtmlDocument3.documentElement.outerHTML);
htmlDocument.Load(sr);
    if (htmlDocument.DocumentNode != null)
    {
        HtmlNode currentNode = htmlDocument.DocumentNode.SelectSingleNode(xPath);
    }

Ahora necesito seleccionar de alguna manera HtmlElement de Webbrowser.Document que corresponde al HtmlNode actual. ¿Puede alguien ayudarme con eso?

Por cierto: no estoy creando ningún bot de spam.

Hola a todos de nuevo. Encontré una solución con recursión, muchas declaraciones if y no htmlagilitypack, pero desafortunadamente no puedo publicarla ahora mismo. Parece que no tengo suficiente reputación.

Aún así, si no hace demasiado esfuerzo, ¿podría decirme cómo resolver este problema con htmlagilitypack, porque mi código parece realmente desagradable?

Respuesta popular

Gracias a todos. Después de pensar y programar durante casi un día entero, tomé la decisión de tener que usar el elemento htmlElement nativo en lugar del htmlNode htmlagilitypack, porque quiero ingresar texto en el elemento HTML en el navegador web. Así que aquí está el código que se me ocurrió. aún así apreciaría si alguien muestra una solución con htmlagilitypack.

    public HtmlElement selectHtmlNode(string xPath, HtmlElement htmlElement)
    {
        string currentNode;
        int indexOfElement;

        //get string representation of current Tag.
        if (xPath.Substring(1,xPath.Length-2).Contains('/'))
            currentNode = xPath.Substring(1, xPath.IndexOf('/', 1) - 1);
        else
            currentNode = xPath.Substring(1, xPath.Length-1);
        //gets the depth of current xPath
        int numOfOccurence = Regex.Matches(xPath, "/").Count;

        //gets the children's index
        int.TryParse(Regex.Match(currentNode, @"\d+").Value, out indexOfElement);

        //if i have to select nth-child ex: /tr[4]
        if (indexOfElement > 1)
        {
            currentNode = currentNode.Substring(0, xPath.IndexOf('[') - 1);
            //the tag that i want to get
            if (numOfOccurence == 1 || numOfOccurence == 0)
            {
                return htmlElement.Children[indexOfElement - 1];
            }
            //still has some children tags
            if (numOfOccurence > 1)
            {
                int i = 1;
                //select nth-child
                foreach (HtmlElement tempElement in htmlElement.Children)
                {
                    if (tempElement.TagName.ToLower() == currentNode && i == indexOfElement)
                    {
                        return selectHtmlNode(xPath.Substring(xPath.IndexOf('/', 1)), tempElement);
                    }
                    else if (tempElement.TagName.ToLower() == currentNode && i < indexOfElement)
                    {
                        i++;
                    }
                }
            }
        }
        else
        {
            if (numOfOccurence == 1 || numOfOccurence == 0)
            {
                return htmlElement.FirstChild;
            }
            if (numOfOccurence > 1)
            {
                foreach (HtmlElement tempElement in htmlElement.Children)
                {
                    if (tempElement.TagName.ToLower() == currentNode)
                    {
                        return selectHtmlNode(xPath.Substring(xPath.IndexOf('/', 1)), tempElement);
                    }
                }
            }
        }
        return null;
    }

La función se llama de esta manera. donde htmlController es instancia de alguna clase.

HtmlElement currentElement = htmlController.selectHtmlNode("/body/form/div/div[2]/div/div/input", webBrowser.Document.GetElementsByTagName("html")[0]);
currentElement.SetAttribute("Value", "hello world");


Related

Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué