2012-10-12 14 views
2

考慮下面的HTML片段(_用於空白):可能在原始輸入中獲​​得HtmlNode的位置和長度?

<head> 
    ... 
    <link ... ___/> 
    <!-- ... --> 
    ... 
</head> 

我使用HTML敏捷性包(HAP)來讀取的HTML文件/片段和,以汽提出的鏈接。我想要做的就是找到LINK(和其他一些)的元素,然後用空格代替它們,就像這樣:

<head> 
    ... 
    ____________ 
    <!-- ... --> 
    ... 
</head> 

解析部分似乎到目前爲止是工作,我得到我期待的節點對於。但是,HAP嘗試修復HTML內容,而我需要的一切都是,正好是一樣的,除了我正在做的更改。另外,HAP在回寫之前讀過的內容時似乎有很多錯誤,所以我想採用的方法是讓HAP解析輸入,然後回到原始輸入並替換內容不想要。

問題是,HtmlNode似乎沒有輸入長度屬性。它有StreamPosition這似乎表明在輸入內部開始讀取節點內容的位置,但我找不到一個長度屬性,它會告訴我有多少字符用於構建節點。

我嘗試使用OuterHtml歡迎使用屬性,但不幸的是,試圖HAP通過去除___/部分以固定LINK(一個LINK元件不應該被關閉)。因此,OuterHtml.Length返回錯誤的長度。

有沒有辦法在HAP中獲取此信息?

回答

3

我最終修改了HtmlAgilityPack的代碼以公開一個新的屬性,該屬性返回的專用HtmlNode字段。

public virtual int OuterLength 
{ 
    get 
    { 
     return (_outerlength); 
    } 
} 

這似乎到目前爲止工作得很好。

2

如果您希望在不重新編譯HAP的情況下獲得相同的結果,請使用反射來訪問私有變量。

我通常不會推薦反射來訪問私有變量,但是我最近有和這個完全相同的情況並使用了反射,因爲我無法使用該程序集的重新編譯版本。要做到這一點,創建包含字段信息對象的靜態變量(以避免重新創建它每次使用):

private static readonly FieldInfo HtmlNodeOuterLengthFieldInfo = typeof(HtmlNode).GetField("_outerlength", BindingFlags.NonPublic | BindingFlags.Instance); 

然後,每當你要訪問的原始外部HTML的真實長度:

var match = htmlDocument.DocumentNode.SelectSingleNode("xpath"); 
var htmlLength = (int)HtmlNodeOuterLengthFieldInfo.GetValue(match); 
相關問題