2

我需要从第 64 行第 45 行到第 183 行第 22 行获取 html 文本节点。我对 XPath 很陌生,我不太确定我的选择是什么。我应该如何进行?我想到了这样的事情:

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

2 回答 2

2

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

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

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

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

于 2013-02-18T19:37:58.970 回答
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以了解行数等)。

于 2013-02-19T01:03:32.427 回答