comment convertir Htmlnode de HtmlAgilityPack en navigateur Web HtmlElement

c# html-agility-pack

Question

Je créais une application qui insère automatiquement des données dans des balises HTML. J'ai xPath pour les balises spécifiques comme '/ html / body / form / div / div [2] / div / div / input' et j'ai réussi à obtenir HtmlNode à l'aide 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);
    }

Maintenant, je dois en quelque sorte sélectionner HtmlElement à partir de Webbrowser.Document qui correspond au HtmlNode actuel. Quelqu'un peut-il m'aider avec ça?

BTW: Je ne crée pas de bot de spam.

Salut tout le monde à nouveau. J'ai trouvé une solution avec la récursivité, beaucoup d'énoncés if et aucun htmlagilitypack, mais malheureusement, je ne peux pas l'afficher pour l'instant. Il semble que je n'ai pas assez de réputation.

Néanmoins, s'il ne fait pas trop d'effort, pouvez-vous me dire comment résoudre ce problème avec htmlagilitypack, car mon code semble vraiment méchant.

Réponse populaire

Merci tout le monde. Après avoir réfléchi et programmé pendant presque toute une journée, j’ai décidé que je devais utiliser l’élément HTML natif au lieu de htmlagilitypack HtmlNode, car je souhaitais saisir du texte dans Htmlelement dans le navigateur Web. alors voici le code que je suis venu avec. j'apprécierais toujours si quelqu'un montrait une solution avec 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 fonction est appelée de cette façon. où htmlController est une instance d'une classe.

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


Related

Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow