使用HTML Agility Pack查詢HTML的ID時出現異常

html html-agility-pack parsing xpath

我正在使用HTML Agility包來解析Visual Studio中的ASPX文件。

我正在搜索具有指定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流( 在開始時沒有頁面聲明)的文件 )?

一般承認的答案

問題出在SelectNodes()的參數中:

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

(在執行替換之後) 不是合法的合法XPath表達式 。所以問題不在於XPath表達“不返回任何節點” - 問題在於它在語法上是非法的。

根據XPath W3C規範:

///descendant-or-self::node()/ ”的縮寫

因此,上述內容擴展到:

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

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

可能你想要

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


許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因
許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因