Auswählen aller Knoten, die Text mit XPath enthalten

c# html-agility-pack xpath

Frage

Ich habe gekämpft, um dieses Problem zu lösen, das ich in den letzten paar Tagen habe. Angenommen, ich möchte den gesamten text () von einem HTML-Dokument erhalten, aber ich möchte nur den XPath des Knotens kennen und abrufen, der Textdaten enthält. Beispiel:

 foreach (var textNode in node.SelectNodes(".//text()")) 
 //do stuff here 

Wenn es jedoch zum Abrufen des XPath von textNode mit textNode.XPath , bekomme ich den vollständigen XPath einschließlich des #text Knotens:

/html[1]/body[1]/div[1]/a[1]/#text

Ich möchte aber nur den enthaltenden Knoten des Textes, zum Beispiel:

/html[1]/body[1]/div[1]/a[1]

Könnte jemand mich auf eine bessere XPath-Lösung hinweisen, um alle Knoten abzurufen, die Text enthalten, aber den XPath nur bis zum enthaltenden Knoten abrufen?

Akzeptierte Antwort

Warum tust du nicht?

string[] elements = getXPath(textNode).Split(new char[1] { '/' });
return String.Join("/", elements, 0, elements.Length-2);

Beliebte Antwort

Statt :

.//text() 

benutzen :

.//*[normalize-space(text())]

Dies selektiert alle "Blattelemente" - Abkömmlinge des Kontext (aktuellen) Knotens, die mindestens einen Nicht-Whitespace-Nur Textknoten Kind haben.



Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum
Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum