使用Html Agility Pack從特定位置選擇HTML


我需要獲取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
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因