Sélectionnez HTML à partir d'une position spécifique à l'aide de HTML Agility Pack

c# html html-agility-pack xpath

Question

Je dois obtenir des nœuds texte HTML de, disons, ligne 64, position de ligne 45, à ligne 183, position de ligne 22. Je suis assez nouveau sur XPath et je ne suis pas sûr de ce que sont mes options. Comment dois-je procéder? Je pensais à quelque chose comme ça:

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

Réponse acceptée

La classe HtmlNode a deux attributs importants (pour ce que vous devez faire):

  • Line (la ligne où commence le nœud)
  • LinePosition (la ligne où le nœud se termine)

Vous pourriez faire quelque chose comme:

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))
);

bien sûr, vous pouvez aussi faire doc.DocumentNode.SelectNodes("//text()").Where(...)

Un problème que vous devrez traiter:

Elle ne vous indique pas où se termine le nœud. Par conséquent, la solution ci-dessus peut vous donner des nœuds se terminant par une ligne supérieure à 183 , ou sur la ligne 183 mais dans une position supérieure à 22 . Pour cela, vous pouvez utiliser la propriété OuterHtml du nœud, et manipuler des chaînes (obtenir la longueur pour savoir où il se termine, fractionné par \n pour savoir combien de lignes, etc.).


Réponse populaire

Vous ne pouvez pas faire cela avec XPath: il ne sait rien des numéros de ligne et des positions de caractères dans le XML.

La position() renvoie la position relative d'un nœud dans une liste de nœuds - par exemple, renvoie 1 pour le premier nœud de la liste, 2 pour le second, etc.

Pour obtenir des informations sur la position de la ligne, vous pouvez analyser le code XML à l'aide de XElement ou XmlReader , puis utiliser l'interface IXmlLineInfo .

Notez cependant que l’utilisation de positions de ligne / caractère pour identifier les fragments d’un fichier XML est problématique: les processeurs XML reformatent systématiquement XML, ajoutant / supprimant des espaces et des lignes de fin, de sorte que le même fragment XML puisse changer de position.



Related

Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi