Wählen Sie HTML aus einer bestimmten Position mit dem Html Agility Pack

c# html html-agility-pack xpath

Frage

Ich brauche HTML-Textknoten von, sagen wir, Zeile 64, Zeilenposition 45 bis Zeile 183, Zeilenposition 22. Ich bin ziemlich neu in XPath und ich bin nicht ganz sicher, was meine Optionen sind. Wie soll ich vorgehen? Ich hatte etwas im Sinn:

var nodes=doc.DocumentNode.SelectNodes("//text()[position() > startPosition and position() < endPosition]");

Akzeptierte Antwort

Die HtmlNode Klasse hat zwei wichtige Attribute (für was Sie tun müssen):

  • Line (die Linie, wo der Knoten beginnt)
  • LinePosition (die Linie, wo der Knoten endet)

Du könntest etwas tun wie:

var nodes = doc.DocumentNode.Descendants("#text").Where(
    x => (x.Line > 64 || (x.Line == 64 && x.LinePosition >= 45)) &&
         (x.Line < 183 || (x.Line == 183 && x.LinePosition <= 22))
);

Natürlich können Sie auch doc.DocumentNode.SelectNodes("//text()").Where(...)

Ein Problem, mit dem du dich befassen musst:

Sie erfahren nicht, wo der Knoten endet. Die obige Lösung könnte also Knoten enthalten, die in einer Zeile größer als 183 oder in Zeile 183 enden, aber in einer Position, die größer als 22 . Dafür können Sie die OuterHtml Eigenschaft des Knotens verwenden und einige Zeichenfolgenmanipulationen durchführen (ermitteln Sie die Länge, um zu wissen, wo sie endet, teilen Sie sie durch \n zu erfahren, wie viele Zeilen usw. vorhanden sind).


Beliebte Antwort

Sie können dies nicht mit XPath tun: Es weiß nichts über Zeilennummern und Zeichenpositionen innerhalb der XML.

Die position() gibt die relative Position eines Knotens in einer Liste von Knoten zurück - z. B. gibt 1 für den ersten Knoten in der Liste, 2 für den zweiten und so weiter zurück.

Um Informationen zur Zeilenposition abzurufen, können Sie den XML- Code mit XElement oder XmlReader analysieren und dann die IXmlLineInfo- Schnittstelle verwenden.

Beachten Sie jedoch, dass die Verwendung von Zeilen- / Zeichenpositionen zur Identifizierung von Fragmenten einer XML-Datei problematisch ist: XML-Prozessoren formatieren XML-Code routinemäßig neu, fügen Leerzeichen hinzu und entfernen Zeilen, sodass dasselbe XML-Fragment die Position ändern kann.



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