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]"
War es hilfreich?

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

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top