我正在尝试使用HtmlAgilityPack构建一个简单的搜索引擎,并使用C#(.NET 4)构建Xpath。 我想找到包含用户定义的搜索词的每个节点,但我似乎无法使XPath正确。 例如:
<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>
如果指定的搜索字是“Mr T”,我想要以下节点:<H1>
,第二个<div>
,<H2>
和第二个<p>
。
我已经尝试了doc.DocumentNode.SelectNodes("//text()[contains(., "+ searchword +")]");
的多种变体,但我似乎总是关注整个DOM中的每个节点。
任何能让我朝着正确方向前进的提示都将非常感激。
答案 0 :(得分:12)
使用强>:
//*[text()[contains(., 'Mr T')]]
这将选择XML文档中具有包含字符串'Mr T'
的文本节点子项的所有元素。
这也可以缩写为:
//text()[contains(., 'Mr T')]/..
这将选择包含字符串'Mr T'
的任何文本节点的父节点。
答案 1 :(得分:1)
根据Xpath,如果您想查找特定关键字,您需要遵循格式(“关键字”是您要搜索的字词):
// * [text()[contains(。,'keyword')]]
您必须遵循与C#中相同的格式,keyword
是您调用的字符串变量:
doc.DocumentNode.SelectNodes("//*[text()[contains(., '" + keyword + "')]]");
答案 2 :(得分:0)
不区分大小写的解决方案:
var xpathForFindText = &#34; // * [text()[contains(翻译(。,&#39; ABCDEFGHIJKLMNOPQRSTUVWXYZ&#39;,&#39; abcdefghijklmnopqrstuvwxyz&#39;),&#39;&#34; + lowerFocusKwd +&# 34;&#39)]]&#34 ;;
var result = doc.DocumentNode.SelectNodes(xpathForFindText);
注意:
要小心,因为lowerFocusKwd不能包含以下字符,因为xpath的格式不正确:
&#39;
答案 3 :(得分:-1)
使用以下内容:
doc.DocumentNode.SelectNodes("//*[contains(text()[1], " + searchword + ")]")
这将选择其第一个文本子(*
)包含text()[1]
的所有元素(searchword
)。