PowerShell用CSV列头匹配XML字段返回空值如何解决
问题排查与解决方案
核心错误点
- 错误1:变量
$b额外包裹了多余的单引号
你写的$b= "'$a'"会给取出的CSV表头值前后加单引号,比如CSV表头是Test1,处理后$b的值是'Test1',但XML里field_name属性的值是不带单引号的,自然匹配不到结果。 - 错误2:自定义函数参数使用错误
你给xml函数传入了$b,参数名定义为$value,但函数内匹配时仍然调用外部变量$b,没有使用传入的参数值,而且把函数定义放在for循环内属于冗余操作,会重复定义函数。 - 错误3:循环索引越界
CSV表头拆分后得到的数组索引范围是0 ~ 列数-1,你写的$i -le $columncount会在最后一次循环时访问不存在的索引,返回空值。 - 错误4:错误读取XML节点值
你提供的XML示例中value节点没有包裹CDATA段,直接调用'#cdata-section'属性无法拿到值,直接取节点文本即可。 - 错误5:重复读取文件浪费性能
循环内反复读取CSV和XML文件,完全可以提前读取一次复用结果。
修正后代码
# 提前读取文件避免重复IO $CSVpath = "G:\1.csv" # 仅读取CSV第一行表头 $csvHeader = (Get-Content $CSVpath -TotalCount 1) -split "," $columncount = $csvHeader.Count [xml]$xmlDoc = Get-Content "G:\1.xml" # 函数定义放在循环外 function Get-XmlValue { param($fieldName) $targetNode = $xmlDoc.enum_types.enum_type.Where({ $_.field_name -eq $fieldName }, 'First') if ($null -eq $targetNode) { return "未找到匹配的field_name: $fieldName" } $itemValue = $targetNode.items.item.Where({ $_.id -eq 1 }).value return $itemValue } # 循环范围修正为小于列数,避免越界 for($i=0; $i -lt $columncount; $i++){ $currentField = $csvHeader[$i] $result = Get-XmlValue $currentField Write-Host $result }
如果你的实际XML中value节点是用CDATA包裹的,只需要把取值行改成$itemValue = $targetNode.items.item.Where({ $_.id -eq 1 }).value.'#cdata-section'即可。
内容的提问来源于stack exchange,提问作者microset
相关产品推荐
相关产品推荐

