使用HTML敏捷包从特定位置选择HTML

本文关键字:HTML 定位 位置 选择 使用 | 更新日期: 2023-09-27 18:00:10

我需要从第64行第45行到第183行第22行获取html文本节点。我对XPath还很陌生,不太确定我的选择是什么。我应该如何继续?我想到了这样的东西:

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

使用HTML敏捷包从特定位置选择HTML

HtmlNode类有两个重要属性(用于您需要做的事情):

  • Line(节点开始的行)
  • LinePosition(节点结束的线路)

你可以做一些类似的事情:

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

当然,你也可以做doc.DocumentNode.SelectNodes("//text()").Where(...)

您必须处理的一个问题:

它不会告诉您节点的结束位置,因此上面的解决方案可能会为您提供在比183大的行中结束的节点,或者在183行中但位于比22大的位置的节点。为此,您可以使用节点的OuterHtml属性,并进行一些字符串操作(获取长度以了解其结束位置,除以'n以了解行数,等等)。

您不能使用XPath来实现这一点:它对XML中的行号和字符位置一无所知。

position()函数返回节点列表中节点的相对位置,例如,列表中第一个节点返回1,第二个节点返回2,依此类推。

要获取行位置信息,可以使用XElement或XmlReader解析XML,然后使用IXmlLineInfo接口。

不过,请注意,使用行/字符位置来识别XML文件的片段是有问题的:XML处理器通常会重新格式化XML,添加/删除空格和结束行,因此同一个XML片段可以更改位置。