以下是示例代码:
$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,请说明。
答案 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']")