我需要获取html文本节点,比方说,第64行,第45行到第183行,第22行。我对XPath很新,我不太清楚我的选择是什么。我该怎么办?我记得这样的事情:
var nodes=doc.DocumentNode.SelectNodes("//text()[position() > startPosition and position() < endPosition]");
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片段可以更改位置。