PowerShell管道+XPath查询异常:无法识别obpdID属性求助
PowerShell XML 查询故障排查提示
先看你提供的代码和XML内容,这里有几个明显的坑,我们逐个拆解排查:
1. 变量名拼写+索引错误
你代码里有一行:
$b=$x.report.row[1].ELEMENT_ID
但你之前定义的XML变量是$y和$p_v,根本没有$x!这会直接导致$b的值为$null,后续的XPath查询自然找不到任何结果。另外注意:PowerShell里XML节点的索引是从0开始的,你的alpha.xml里只有一个<row>,所以应该改成:
$b=$y.report.row[0].ELEMENT_ID
2. XPath 节点大小写不匹配
你的beta.xml里的节点是大写的<ID>,但你在XPath里用的是小写的id:
$p_v.SelectNodes("//report/row[id/text()='$_']")
XML是严格大小写敏感的!这里必须改成和XML里一致的大写ID:
$p_v.SelectNodes("//report/row[ID/text()='$_']")
3. 赋值运算符和比较运算符搞混了
你代码里的判断条件用了=(赋值操作)而不是-eq(比较操作):
if ($p_v.SelectNodes("//report/row[id/text()='$_']").obpdID = $NULL)
这行代码是把$null赋值给obpdID,而不是判断它是否为$null。正确写法应该是(PowerShell推荐把$null放左边,避免意外赋值):
if ($null -eq $p_v.SelectNodes("//report/row[ID/text()='$_']").obpdID)
4. 管道环境下的额外排查点
如果修正以上问题后,还是出现“直接运行正常、管道里不行”的差异,可以试试这两个操作:
- 把管道变量存为临时变量:在
%{}(ForEach-Object)块里,变量解析逻辑可能和直接运行时略有不同,先把$_存起来再用:| %{ $currentPID = $_ if ($null -eq $p_v.SelectNodes("//report/row[ID/text()='$currentPID']").obpdID) { Write-Host "Hurra!" } } - 显式提取节点文本:有时候直接访问
.obpdID不如用.InnerText可靠,可以先获取节点再判断:| %{ $currentPID = $_ $targetNode = $p_v.SelectNodes("//report/row[ID/text()='$currentPID']") if ($null -eq $targetNode -or $null -eq $targetNode.obpdID.InnerText) { Write-Host "Hurra!" } }
修正后的完整代码参考
[xml]$y = Get-Content alpha.xml [xml]$p_v = Get-Content beta.xml $b = $y.report.row[0].ELEMENT_ID $y.SelectNodes("//report/row[elementRootID/text()='$b']").pID | ForEach-Object { $currentPID = $_ $targetNode = $p_v.SelectNodes("//report/row[ID/text()='$currentPID']") if ($null -eq $targetNode.obpdID) { Write-Host "Hurra!" } }
内容的提问来源于stack exchange,提问作者Daniel Sommerfeld
相关产品推荐
相关产品推荐

