我需要获取html文本节点,比方说,第64行,第45行到第183行,第22行。我对XPath很新,我不太清楚我的选择是什么。我该怎么办? 我记得这样的事情:
var nodes=doc.DocumentNode.SelectNodes("//text()[position() > startPosition and position() < endPosition]");
答案 0 :(得分:2)
你无法用XPath做到这一点:它对XML中的行号和字符位置一无所知。
position()
函数返回节点列表中节点的相对位置 - 例如为列表中的第一个节点返回1,为第二个节点返回2,依此类推。
要获取行位置信息,您可以使用XElement或XmlReader解析XML,然后使用IXmlLineInfo界面。
请注意,使用行/字符位置来标识XML文件的片段是有问题的:XML处理器通常会重新格式化XML,添加/删除空格和结束行,因此相同的XML片段可以更改位置。
答案 1 :(得分:2)
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
拆分以了解有多少行等。)