使用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]");
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片段可以更改位置。