2010-07-04 57 views
2

我正在使用HTML Agility包來解析Visual Studio中的ASPX文件。使用HTML敏捷性包查詢HTML的ID時出現異常

我正在搜索具有指定ID屬性的元素。

我正在使用的代碼是:

var html = new HtmlAgilityPack.HtmlDocument(); 
html.LoadHtml(docText); 
if (html.DocumentNode != null) 
{ 
    try 
    { 
      var tagsWithId = html.DocumentNode.SelectNodes(string.Format("//[@id='{0}']", selector.Id)); 

然而,當我運行這段代碼會拋出異常「表達式的值必須爲節點集」。

誰能告訴我爲什麼這個「必須」評估爲節點集?爲什麼它不能簡單地返回節點(下一行調用tagsWithId.Count)?當然,SelectNodes方法返回的HtmlNodeCollection可以包含0個節點?

或者是由於格式錯誤的Xpath表達式導致的錯誤? [我正在測試這個選擇器ID肯定存在於文件中< div id =「thisId」>。]

是否可以直接從Visual Studio加載ASPX文件(我正在構建加載項),還是將包含XML錯誤,而我將不得不加載輸出HTML流(,而不在頁面聲明在文件的開頭,。)?

+0

問得好(+1)。請參閱我的答案以獲取詳細解釋以及要使用的正確XPath表達式。 :) – 2010-07-04 15:36:22

回答

4

的問題是在參數SelectNodes()

//[@id='{0}'] 

(進行置換後)不是sybtactically法律XPath表達式。所以問題不在於XPath expresiion「返回沒有節點」 - 問題在於它在語法上是非法的。

作爲每中的XPath W3C規格:

//是短期的/descendant-or-self::node()/

因此,上述被擴展爲:

/descendant-or-self::node()/[@id='{0}']

注意的是,最後的位置步驟具有沒有節點測試並且以謂詞開始。根據XPath的語法規則,這是非法的。

也許你想

//*[@id='{0}'] 
+0

謝謝非常Dimitre,你絕對正確。 – awj 2010-07-04 16:58:51