re:test()XPath到HtmlAgilityPack(獲取匹配的regex內部的所有p標籤)

c# html html-agility-pack xpath

我想要所有<p>=.+=</p>標籤。正則表達式獨立工作,沒有<p>標籤。

這是我的XPath: "//p[re:test(.,'^=.+=$', 'i')]""//p[re:test(.,'^=.+=$', 'i')]"

但是當我插入它時,我得到一個例外,

HtmlNodeCollection pNodes = htmlDoc.DocumentNode.SelectNodes("//p[re:test(.,'^=.+=$', 'i')]");

例外是:

需要命名空間管理器或XsltContext。此查詢具有前綴,變量或用戶定義的函數。

編輯:Html由FCKEditor生成,沒有定義名稱空間。我是否需要為此設置一些東西?

HTML:

HtmlNodeCollection pNodes = htmlDoc.DocumentNode.SelectNodes("//p[re:test(.,'^=.+=$', 'i')]");

一般承認的答案

您遇到的錯誤是由於表達式re:test使用名為test的XPATH函數(在前綴為re的名稱空間中聲明),這是XSLT上下文所不知道的。

我不知道你從哪裡得到那個表達式,但它不是標準的,所以它在Html Agility Pack上下文中沒有任何意義:-)

有關深入的解釋,請參閱此處的精彩文章: 向XPath添加自定義函數 。請注意,您可以使用這些技術使其工作。

也就是說,這裡是一個“純粹的”Html Agility Pack / XPATH實現:

var pNodes = htmlDoc.DocumentNode.SelectNodes("//p[text()='=.+=']");

它使用過濾器(在[和]之間)和標準XPATH函數text(),這意味著“內部文本”。


熱門答案

顯然HtmlAgilityPack不處理命名空間(不是我有一個)。所以我想出了這個黑客,

var pNodes = htmlDoc.DocumentNode.SelectNodes("//p")
    .Where(node => Regex.Match(node.InnerText, "^=.+=$").Success);

如果有一個HtmlAgilityPack解決方案,我很樂意聽到它!




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