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

时间:2013-02-18 17:27:17

标签: c# html xpath html-agility-pack

我需要获取html文本节点,比方说,第64行,第45行到第183行,第22行。我对XPath很新,我不太清楚我的选择是什么。我该怎么办? 我记得这样的事情:

var nodes=doc.DocumentNode.SelectNodes("//text()[position() > startPosition and position() < endPosition]");

2 个答案:

答案 0 :(得分:2)

你无法用XPath做到这一点:它对XML中的行号和字符位置一无所知。

position()函数返回节点列表中节点的相对位置 - 例如为列表中的第一个节点返回1,为第二个节点返回2,依此类推。

要获取行位置信息,您可以使用XElementXmlReader解析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拆分以了解有多少行等。)