XPath表达式不接受变量

时间:2015-07-13 15:36:18

标签: powershell xpath

以下是示例代码:

$xml = New-Object XML
$xml.load('C:\Users\Example\Desktop\examp.xml')

# this works
$node = $xml.selectSingleNode("//SERVER[@name='EXAMPLE']")

# this does not work
$t = 'EXAMPLE'
$node = $xml.selectSingleNode("//SERVER[@name=$t]")

为什么呢?如果您也想查看XML,请说明。

1 个答案:

答案 0 :(得分:3)

XPath表达式中的字符串必须用引号括起来(单引号或双引号)。正如@ MathiasR.Jessen在对您的问题的评论中指出的那样,当//SERVER[@name=EXAMPLE]//SERVER[@name="EXAMPLE"]时,您的表达式的评估结果为//SERVER[@name='EXAMPLE']。表达式

中的引号
$t = 'EXAMPLE'

只是将EXAMPLE定义为PowerShell 的字符串。它们不会成为字符串的一部分,因此在使用XPath表达式扩展字符串中的变量时不会出现。

演示:

PS C:\> $t = 'EXAMPLE'
PS C:\> $t
EXAMPLE
PS C:\> "//SERVER[@name=$t]"      # wrong
//SERVER[@name=EXAMPLE]
PS C:\> "//SERVER[@name='$t']"    # correct
//SERVER[@name='EXAMPLE']
PS C:\> "//SERVER[@name=`"$t`"]"  # correct
//SERVER[@name="EXAMPLE"]

将缺少的引号添加到XPath表达式中,问题将消失:

$node = $xml.selectSingleNode("//SERVER[@name='$t']")