Ich habe eine Anwendung erstellt, die automatisch Daten in HTML-Eingabe-Tags einfügt. Ich habe xPath für spezifische Tags wie '/ html / body / form / div / div [2] / div / div / input' und habe es geschafft, HtmlNode mit Hilfe von HtmlAgilityPack zu bekommen
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);
}
Jetzt muss ich HtmlElement aus Webbrowser.Document auswählen, das dem aktuellen HtmlNode entspricht. Kann mir jemand dabei helfen?
BTW: Ich erstelle keinen Spam-Bot.
Hallo alle zusammen. Ich fand eine Lösung mit Rekursion, viele if-Anweisungen und kein htmlagilitypack, aber leider kann ich es jetzt nicht posten. Es scheint, dass ich nicht genug Ansehen habe.
Trotzdem, wenn es nicht zu viel Mühe macht, kannst du mir bitte sagen, wie ich dieses Problem mit htmlagilitypack lösen kann, weil mein Code wirklich fies aussieht.
Danke euch allen. Nachdem ich fast den ganzen Tag über gedacht und programmiert hatte, kam ich zu der Entscheidung, dass ich natives htmlElement anstelle von htmlagilitypack HtmlNode verwenden muss, weil ich Text in Htmlelement in webbrowser eingeben möchte. also hier ist der Code, den ich mir ausgedacht habe. trotzdem würde ich mich freuen wenn jemand eine lösung mit htmlagilitypack zeigt.
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;
}
Funktion wird auf diese Weise aufgerufen. wo htmlController Instanz einer Klasse ist.
HtmlElement currentElement = htmlController.selectHtmlNode("/body/form/div/div[2]/div/div/input", webBrowser.Document.GetElementsByTagName("html")[0]);
currentElement.SetAttribute("Value", "hello world");