如何将 HtmlAgilityPack 的 Htmlnode 转换为 Web 浏览器 HtmlElement

本文关键字:Web 浏览器 HtmlElement 转换 Htmlnode HtmlAgilityPack | 更新日期: 2023-09-27 18:36:53

我正在创建一个自动将数据插入html输入标签的应用程序。我有特定标签的xPath,如'/html/body/form/div/div[2]/div/div/input',我设法在HtmlAgilityPack的帮助下获得了HtmlNode

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);
    }

现在我需要以某种方式从Webbrowser.Document中选择HtmlElement,它对应于当前的HtmlNode。有人可以帮我吗?

顺便说一句:我没有创建任何垃圾邮件机器人。

大家好。我找到了递归的解决方案,很多if语句和没有htmlagilitypack,但不幸的是我现在无法发布它。看来我的名声不够。

不过,如果它没有付出太多努力,你能告诉我如何使用htmlagilitypack解决这个问题吗,因为我的代码看起来真的很讨厌。

如何将 HtmlAgilityPack 的 Htmlnode 转换为 Web 浏览器 HtmlElement

谢谢大家。经过几乎一整天的思考和编程,我决定必须使用本机htmlElement而不是htmlagilitypack HtmlNode,因为我想在web浏览器中将文本输入到Htmlelement中。所以这是我想出的代码。如果有人展示带有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;
    }

函数以这种方式调用。 其中 htmlController 是某个类的实例。

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

如果你知道你的元素的某个位置,你可以简单地通过

HtmlNode mynode=htmlDocument.DocumentNode.SelectSingleNode("//div[@class='fooclass']");

或者你可以对 HtmlNodeCollection 使用 Select 函数。

获得某些节点后,只需使用mynode变量属性,InnerHtml或InnerText属性即可满足您的需求。

例如:如果您的节点引用映像 Mynode。属性["源"]。值将显示图像源 URI。

PS:我假设htmlDocument是HtmlAgilityPack的类。