Ich habe Probleme beim Abrufen eines einzelnen Knotens durch seinen expliziten XPath, den ich bereits auf andere Weise gefunden habe. Ich habe Knoten und ich kann seinen XPath bekommen, aber wenn ich versuche, denselben Knoten wieder dieses Mal über node.XPath abzurufen, gibt es den "Ausdruck muss zu einem Knotensatz" Fehler auswerten. Sollte das nicht funktionieren? Ich verwende HtmlAgilityPack in C # btw für das HtmlDocument.
HtmlDocument doc = new HtmlDocument();
doc.Load(@"..\..\test1.htm");
HtmlNode node = doc.DocumentNode.SelectSingleNode("(//node()[@id='something')])[first()]");
HtmlNode same = doc.DocumentNode.SelectSingleNode(node.XPath);
BTW: Dies ist der Wert von node.XPath:
"/html[1]/body[1]/table[1]/tr[1]/td[1]/div[1]/div[1]/div[2]/table[1]/tr[1]/td[1]/div[1]/div[1]/table[1]/tr[1]/td[1]/div[1]/div[1]/div[4]/div[2]/div[1]/div[1]/div[4]/#text[2]"
Ich konnte es erreichen, indem ich #text durch die Funktion text () ersetzte. Ich bin mir nicht sicher, warum es den XPath nicht einfach so ausgegeben hat.
HtmlNode same = doc.DocumentNode.SelectSingleNode(node.XPath.Replace("#text","text()");
Ihr XPath endet in "#text [2]", was "das zweite Attribut 'text'" bedeutet. Attribute sind keine Knoten, sie sind Knotenmetadaten.
Dies ist ein häufiges Problem, das ich mit XPath hatte: Ich möchte den Wert eines Attributs haben, während die XPath-Operation unbedingt einen Knoten extrahieren muss.
Die Lösung, die ich dafür verwendet habe, besteht darin, meinen XPath-Abruf mit etwas zu umbrechen, das den Attributteil der Zeichenfolge erkennt und ausstreift (über einen Methodenaufruf myXPathString.LastIndexOf (#)) und dann den abgeschnittenen myXPathString verwendet Knoten und sammeln Sie den gewünschten Attributwert als zweiten Schritt.
Ich hoffe, das hilft,
J