求助:XML转CSV时如何实现成员信息逐行展示
问题:XML转CSV格式异常修复
原始XML内容
<App> <SecurityGroup name="Admin"> <Member username="John1" displayName="JohnDoe"/> <Member username="Jane1" displayName="JoeDoe"/> </SecurityGroup> </App>
尝试的PowerShell脚本
$xml.app.childnodes | Select-Object @( @{l="name";e={ $_.member.username}}, @{l="display";e={ $_.member.displayname }}, @{l="group";e={ $_.name }} ) | Export-CSV "c:/test.csv"
当前错误输出
Security Group Username Displayname Admin John1 Jane1 JohnDoe JaneDoe
期望输出格式
| SecurityGroup | Username | Displayname |
|---|---|---|
| Admin | John1 | JohnDoe |
| Admin | Jane1 | JoeDoe |
修复后的PowerShell脚本
# 加载XML(如果是从文件读取,替换为 $xml = [xml](Get-Content "你的XML文件路径")) $xml = [xml]@' <App> <SecurityGroup name="Admin"> <Member username="John1" displayName="JohnDoe"/> <Member username="Jane1" displayName="JoeDoe"/> </SecurityGroup> </App> '@ # 嵌套遍历组和成员,生成逐行数据 $output = foreach ($group in $xml.App.SecurityGroup) { foreach ($member in $group.Member) { [PSCustomObject]@{ SecurityGroup = $group.name Username = $member.username Displayname = $member.displayName } } } # 导出CSV(-NoTypeInformation避免生成类型注释行) $output | Export-CSV "c:/test.csv" -NoTypeInformation
修复说明
原脚本中$_.member会返回当前组下的所有成员节点集合,直接访问username/displayName会把所有成员的对应值拼接成字符串,导致多行数据合并为一行。
修复后的脚本通过嵌套遍历解决问题:
- 先遍历每个
SecurityGroup节点 - 对每个组,再遍历其下的每个
Member节点 - 为每个成员单独创建对象,带上所属组的名称
- 最后统一导出,即可得到每行对应一个成员的目标格式
内容的提问来源于stack exchange,提问作者Hemnath
相关产品推荐
相关产品推荐

