2012-01-20 143 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的将是不好的格式:

'