2012-09-07 44 views
4

我有需要檢索使用htmlagilitypack與C#2其他html元素中包含的html元素。如何使用htmlagilitypack獲取2個周圍html元素之間的html?

舉個例子,我有以下幾點:

<div id="div1" style="style definition here"> 
    <strong> 
    <font face="Verdana" size="2">Your search request retrieved 0 matches.</font> 
    </strong> 
    <font face="Verdana" size="2">Some more text here.</font> 
    <br><br> 
    <!--more html here--> 
</div> 

我想回到一切不返回任何這些元素的

<div id="div1"> 

和第一

<br> 

之間 。

我無法理解所需的語法,因此如果有人可以向我解釋獲取存在於其他已知開始標記之間的HTML的最佳方法,同時忽略結束標記,我將非常感激。

我還應該提到,我需要首先在完整的網頁的周圍html中找到div的id爲div1的div。

我不需要實際節點與來自特定HtmlDocument的節點的引用相等,它們只需要具有相同的內容。

回答

1

HtmlNode實例返回時,同一節點的多個調用將產生相同的引用。你可以使用它來獲得你的優勢(雖然它是一個實現細節,所以要小心)。

基本上,你會得到所有的元素直到有問題的節點的後代。您選擇的節點,從開始:

HtmlNode divNode = doc.DocumentNode.SelectSingleNode("div[@id='div1']"); 

要上去的節點:

// Note that in this case, working off the first node is not necessary, just 
// convenient for this example. 
HtmlNode brNode = divNode.SelectSingleNode("br"); 

然後使用TakeWhile extension methodEnumerable class採取的所有元素,直到第二個元素,像這樣:

// The nodes. 
IEnumerable<HtmlNode> nodes = divNode.Descendants(). 
    TakeWhile(n => n != brNode). 
    Where(n => n.NodeType == HtmlNodeType.Element); 

它在TakeWhile方法(n => n != brNode)依賴於基準比較的比較(這是第i mplementation細節部分)。

最後一個過濾器是給你的元素節點,因爲這是你通常調用SelectSingleNode;如果你想處理其他節點類型,你可以省略。

騎自行車通過這樣的節點:

foreach (HtmlNode node in nodes) 
{ 
    // Print. 
    Console.WriteLine("Node: {0}", node.Name); 
} 

產地:

Node: strong 
Node: font 
Node: font 
+0

完美!非常感謝你。 – kseeley