匹配XPath表达式中的多个域

时间:2012-08-26 20:30:51

标签: c# xpath html-agility-pack

目前我正在做类似这样的事情,让所有链接指向页面中的某个域:

var links = entryNode.SelectNodes(".//a[contains(@href,'site.com')]");

我想修改它,以便我可以获得指向我指定的任何域的a个元素。例如:

var links = entryNode.SelectNodes(".//a[contains(@href,'site.com') | contains(@href,'othersitesite.com') | contains(@href,'thirdsite.com')]");

有没有办法在一个XPath表达式中执行此操作?

谢谢。

2 个答案:

答案 0 :(得分:1)

使用

.//a[contains(@href,'site.com')
   or
     contains(@href,'othersitesite.com')
   or
     contains(@href, 'thirdsite.com')
     ]

答案 1 :(得分:0)

假设您要求完全匹配//之后和之后任何/之前发生的字符串部分(即您希望匹配子域名) (),然后以下解决方案工作:

.//a[contains(' site.com othersitesite.com thirdsite.com ', 
             concat(' ', substring-before(substring-after(
                                          concat(@href, '/'), '//'), '/'), ' '))]

这是有效的,因为你正在寻找一个更大的字符串中的空格包围的目标字符串,该字符串包含每个被空格包围的所有可能的目标字符串。

让我们用一个具体的例子。假设您有以下文档:

<r>
    <a href="http://google.com"/>
    <a href="http://yahoo.com/"/>
    <a href="http://bing.com"/>
    <a href="http://altavista.com"/>
</r>

并且您希望匹配 google.com yahoo.com altavista.com 的锚点(相对于当前节点) 。以下表达式实现了:

.//a[contains(' google.com yahoo.com altavista.com ', 
             concat(' ', substring-before(substring-after(
                                          concat(@href, '/'), '//'), '/'), ' '))]

您可能没有上述要求。如果是这种情况,那么只需使用@Dimitre的(好的)答案。此解决方案仅作为可能的替代方案提供,可能还有助于您进一步了解自己的要求。