1

目前我正在做这样的事情来获取页面中指向某个域的所有链接:

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 表达式中做到这一点?

谢谢你。

4

2 回答 2

1

使用

.//a[contains(@href,'site.com')
   or
     contains(@href,'othersitesite.com')
   or
     contains(@href, 'thirdsite.com')
     ]
于 2012-08-26T21:17:09.423 回答
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.comyahoo.comaltavista.com的锚点(相对于当前节点)。下面的表达式实现了这一点:

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

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

于 2012-08-27T05:42:38.377 回答