XPath Problem, immer „Ausdruck muss zu einem Knotenmenge auszuwerten.“ Fehler
-
28-09-2019 - |
Frage
Ich habe Probleme, einen einzelnen Knoten durch seine explizite XPath Abrufen, dass ich bereits durch andere Wege gefunden haben. Ich habe node und ich kann seine XPath, aber wenn ich versuche, das gleiche Knoten diesmal wieder abzurufen über node.XPath den „Ausdruck muss zu einem Knotenmenge auswerten“ gibt Fehler. Sollte das nicht? Ich verwende HtmlAgilityPack in C # btw für die 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]"
Lösung
Ich konnte es zum Laufen bringen, indem #text mit der Funktion Text ersetzen (). Ich bin sicher nicht, warum es nicht nur die XPath auf diese Weise in erster Linie emittieren hat.
HtmlNode same = doc.DocumentNode.SelectSingleNode(node.XPath.Replace("#text","text()");
Andere Tipps
Ihre XPath Ende in "#text [2]", das bedeutet "das zweite 'Text' Attribut". Attribute sind nicht Knoten, sie sind Knoten Metadaten.
Dies ist ein häufiges Problem, das ich mit XPath hätte. Den Wert ein Attribut zu wollen, während der XPath Betrieb unbedingt einen Knoten zu extrahieren hat
Die Lösung, die ich für diese verwendet habe, ist meine XPath einzuwickeln mit etwas holen, das erkennt und Streifen aus dem Attribut Teil der Zeichenfolge (über einen myXPathString.LastIndexOf ( „#“) Methodenaufruf) und dann die abgeschnitten myXPathString verwendet den Knoten zu holen und den gewünschten Attributwert in einem zweiten Schritt sammeln.
Ich hoffe, das hilft,
J