目前我正在做类似这样的事情,让所有链接指向页面中的某个域:
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表达式中执行此操作?
谢谢。
答案 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的(好的)答案。此解决方案仅作为可能的替代方案提供,可能还有助于您进一步了解自己的要求。