2012-01-20 140 views
5

我正在嘗試使用HtmlAgilityPack和Xpath與C#(.NET 4)構建簡單的搜索引擎。 我想找到包含用戶定義的搜索詞的每個節點,但我似乎無法獲得正確的XPath。 例如:使用Xpath和HtmlAgilityPack查找包含特定單詞或單詞的所有含innertext的元素

<HTML> 
<BODY> 
    <H1>Mr T for president</H1> 
    <div>We believe the new president should be</div> 
    <div>the awsome Mr T</div> 
    <div> 
    <H2>Mr T replies:</H2> 
    <p>I pity the fool who doesn't vote</p> 
    <p>for Mr T</p> 
    </div> 
    </BODY> 
</HTML> 

如果指定的搜索內容是「T先生」我想以下節點:<H1>,第二<div><H2>和第二<p>。 我已經嘗試了很多doc.DocumentNode.SelectNodes("//text()[contains(., "+ searchword +")]");的變體,但我似乎總是在整個DOM中的每個節點。

任何提示讓我在正確的方向將非常感激。

回答

12

使用

//*[text()[contains(., 'Mr T')]] 

這將選擇XML文檔中有一個文本節點孩子包含字符串'Mr T'所有元素。

這也可以被寫爲較短

//text()[contains(., 'Mr T')]/.. 

這將選擇包含字符串'Mr T'任何文本節點的父節點(一個或多個)。

+0

你的第二個表達式匹配正是OP說,他嘗試(除了額外的'..'),所以我不知道他爲什麼認爲它不起作用。 –

+0

@lwburk:它「沒有用,因爲它選擇*文本節點*,他需要他們的父母。 –

+0

對,我明白了,但它肯定不會選擇*」整個DOM中的每個節點*「(聲明) –

-1

使用以下命令:

doc.DocumentNode.SelectNodes("//*[contains(text()[1], " + searchword + ")]") 

這將選擇所有元素(*),其第一個文本子(text()[1])包含searchword

1

根據Xpath的,如果你想找到你需要按照格式的特定的關鍵字(「關鍵字」是你想查的單詞):

// * [文本()[含有]]

你必須遵循上述相同的格式,在C#中,keyword就是你所謂的字符串變量( '關鍵字'。):

doc.DocumentNode.SelectNodes("//*[text()[contains(., '" + keyword + "')]]"); 
+0

請嘗試更詳細地解釋您的答案。這不僅對OP有幫助,而且對未來可能有同樣問題的其他人也有幫助。 –

0

不區分大小寫的解決方案:

變種xpathForFindText = 「// * [文本()[含有(翻譯( 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'), '」 + lowerFocusKwd + 「')]]」;

var result = doc.DocumentNode。的SelectNodes(xpathForFindText);

注:

要小心,因爲lowerFocusKwd不得包含以下字符,因爲XPath的將是不好的格式:

'