使用Html Agility Pack从特定位置选择HTML

c# html html-agility-pack xpath

我需要获取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,依此类推。

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

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




许可下: CC-BY-SA with attribution
不隶属于 Stack Overflow
这个KB合法吗? 是的,了解原因
许可下: CC-BY-SA with attribution
不隶属于 Stack Overflow
这个KB合法吗? 是的,了解原因