我需要从第 64 行第 45 行到第 183 行第 22 行获取 html 文本节点。我对 XPath 很陌生,我不太确定我的选择是什么。我应该如何进行?我想到了这样的事情:
var nodes=doc.DocumentNode.SelectNodes("//text()[position() > startPosition and position() < endPosition]");
我需要从第 64 行第 45 行到第 183 行第 22 行获取 html 文本节点。我对 XPath 很陌生,我不太确定我的选择是什么。我应该如何进行?我想到了这样的事情:
var nodes=doc.DocumentNode.SelectNodes("//text()[position() > startPosition and position() < endPosition]");
您不能用 XPath 做到这一点:它对 XML 中的行号和字符位置一无所知。
该position()
函数返回一个节点在节点列表中的相对位置 - 例如,返回 1 表示列表中的第一个节点,返回 2 表示第二个节点,依此类推。
要获取行位置信息,您可以使用XElement或XmlReader解析 XML ,然后使用IXmlLineInfo接口。
请注意,尽管使用行/字符位置来识别 XML 文件的片段是有问题的:XML 处理器通常会重新格式化 XML,添加/删除空格和结束行,因此相同的 XML 片段可以改变位置。
该类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
以了解行数等)。