PowerShell遍历XML校验标签值时缺失标签误输出问题求解
问题原因
你当前的判断逻辑没有区分「标签不存在(值为空)」和「标签存在但取值不合法」两种场景,XML中不存在的节点取值为$null,$null肯定不在$vals列表里,所以会触发误判。
修改方案
调整判断逻辑:仅当标签存在(取值非空)时才执行合法性校验,所有存在的标签都合法就不输出ID,只要有一个存在的标签不合法就输出ID。
修改后的代码如下:
$vals= ('sslop','mlop','rxid') Foreach ($xd in $docs) { $id = $xd.'com.xyz.abc.123'.bill.Id $Cname = $xd.'com.xyz.abc.123'.Class.Name $Cno = $xd.'com.xyz.abc.123'.Class.ComName $Cfloor = $xd.'com.xyz.abc.123'.Class.FloorName # 定义非法标记,初始为否 $invalid = $false # 逐个字段校验:仅非空字段需要判断是否合法 if ($Cname -and $Cname -notin $vals) { $invalid = $true } if ($Cno -and $Cno -notin $vals) { $invalid = $true } if ($Cfloor -and $Cfloor -notin $vals) { $invalid = $true } # 只要有一个字段非法就输出ID if ($invalid) { Write-Output $id } }
验证说明
- 针对示例XML1:
$Cfloor为空,跳过校验,$Cname和$Cno都在允许列表,$invalid为$false,不会输出ID,符合预期 - 针对示例XML2:
$Cname非空且取值不在列表中,$invalid为$true,输出ID 6548,符合预期
内容的提问来源于stack exchange,提问作者Mayhan
相关产品推荐
相关产品推荐

