PowerShell如何获取深层XML中field_name=Test2且id=3的对应值
问题原因
原有代码失效主要有三个原因:
- 没有先过滤
field_name属性为Test2的<Type>父节点,会匹配所有<Type>下符合id=3的节点,无法精准定位到Test2分组下的内容 - 部分PowerShell版本对XML节点名称大小写敏感,原有代码写的
$xml.types对应根节点名是大写<Types>,可能导致节点读取为空 - XML中读取的
id值默认是字符串类型,直接和数字3做相等比较可能出现类型不匹配的问题
正确实现方案
方案1:沿用PowerShell对象筛选写法
和你原有写法逻辑接近,适配修正后代码如下:
# 加载XML文件,指定编码避免乱码 $xml = [xml](Get-Content "C:\Test.xml" -Encoding UTF8) # 先筛选Test2分组,再匹配id=3的节点取value $targetValue = $xml.Types.Type | Where-Object { $_.field_name -eq 'Test2' } | Select-Object -ExpandProperty items | Select-Object -ExpandProperty item | Where-Object { [int]$_.id -eq 3 } | Select-Object -ExpandProperty value # 输出结果:C $targetValue
方案2:使用XPath查询(更简洁高效)
直接通过XPath语法定位目标节点,代码更短,查询效率更高:
$xml = [xml](Get-Content "C:\Test.xml" -Encoding UTF8) $targetValue = $xml.SelectSingleNode('//Type[@field_name="Test2"]/items/item[id="3"]/value').InnerText # 输出结果:C $targetValue
内容的提问来源于stack exchange,提问作者Narav
相关产品推荐
相关产品推荐

