我需要将下面的XML转换为CSV
<App>
<SecurityGroup name="Admin">
<Member username="John1" displayName="JohnDoe"/>
<Member username="Jane1" displayName="JoeDoe"/>
</SecurityGroup>
</App>
我也试了下面这个
$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
我需要以下格式
安全组 | 用户名 | Displayname | 管理 | John1 | JohnDoe |
---|---|---|
管理 | Jane1 | JoeDoe |
在计算属性中指定为Select-Object
参数,$_.member
创建所有Member
元素的数组(由于成员访问枚举),这就是为什么您的CSV每个字段包含多个属性值。
您要做的是,下降到已经在第一个成员访问链中的Member
元素:
$xml.app.childnodes.member | Select-Object @(
@{ l='name'; e='username'}
@{ l='display'; e='displayname'}
@{ l='group'; e={ $_.ParentNode.name }}
) | Export-CSV "c:/test.csv"
输出:
"name","display","group"
"John1","JohnDoe","Admin"
"Jane1","JoeDoe","Admin"
指出:
- 当您有了输入和输出属性的直接映射时,您可以通过将输入属性名称指定为字符串而不是为计算属性的表达式(e)指定scriptblock来简化代码,就像我上面所做的那样。
- 可以省略数组子表达式
@(…)
中的逗号,因为每个数组元素都位于自己的行上。当每行指定多个数组元素时,您只需要一个逗号。 $xml.app.childnodes.member
创建一个包含any中所有Member
元素的数组App
元素下的子元素。你可能想把枚举限制为SecurityGroup
子元素,这样写出来:$xml.App.SecurityGroup.Member