PowerShell读取XML:如何提取嵌套Types节点内容并格式化输出
问题:PowerShell读取XML嵌套节点并格式化输出
尝试读取XML文件并输出其中信息,XML结构如下:
<?xml version="1.0" encoding="utf-8"?> <ModelList> <Model name="ThinkCentre M715Q"> <Types> <Type>10M4</Type> <Type>10RA</Type> <Type>10RB</Type> <Type>10M5</Type> <Type>10RC</Type> <Type>10M2</Type> <Type>10RD</Type> <Type>10M3</Type> </Types> </Model> </ModelList>
使用以下PowerShell代码获取Model的name属性:
[xml]$xmlFile = Get-Content -Path C:\Temp\data.xml $xmlFile.GetType().Attributes $xmlFile.ModelList.Model | Format-Table
当前输出:
name Types ---- ----- ThinkCentre M715Q Types
期望输出:
name Types ---- ----- ThinkCentre M715Q 10M4, 10RA, 10RB, 10M5, 10RC...
需要指导如何将嵌套Type值与对应Model关联并格式化输出。
解决方案
当前代码直接输出Model对象时,Types列显示的是XML节点对象而非具体Type值,需通过计算属性将嵌套的<Type>节点值合并为逗号分隔的字符串,再与name属性关联输出。
基础实现(完整显示所有Type值)
[xml]$xmlFile = Get-Content -Path C:\Temp\data.xml $xmlFile.ModelList.Model | Select-Object ` name, @{Name='Types'; Expression={$_.Types.Type -join ', '}} | Format-Table -AutoSize
输出效果:
name Types ---- ----- ThinkCentre M715Q 10M4, 10RA, 10RB, 10M5, 10RC, 10M2, 10RD, 10M3
带省略号的实现(适配长内容)
如果希望过长的Types内容自动截断并添加省略号,可在计算属性中增加长度判断:
[xml]$xmlFile = Get-Content -Path C:\Temp\data.xml $xmlFile.ModelList.Model | Select-Object ` name, @{ Name='Types'; Expression={ $typesStr = $_.Types.Type -join ', ' # 设定截断长度,这里以30为例 if ($typesStr.Length -gt 30) { $typesStr.Substring(0, 30) + '...' } else { $typesStr } } } | Format-Table -AutoSize
输出效果:
name Types ---- ----- ThinkCentre M715Q 10M4, 10RA, 10RB, 10M5, 10RC...
原理说明
$_.Types.Type:遍历当前Model节点下所有<Type>子节点,获取其文本值-join ', ':将多个Type值合并为单个逗号分隔的字符串- 计算属性(
@{Name='Types'; Expression={...}}):替换原有的Types节点对象,将合并后的字符串作为新的Types列值
内容的提问来源于stack exchange,提问作者Obbo
相关产品推荐
相关产品推荐

