需要帮助将XML转换为CSV



我需要将下面的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

我需要以下格式

tbody> <<tr>
安全组用户名Displayname
管理John1JohnDoe
管理Jane1JoeDoe

计算属性中指定为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 
    

相关内容

  • 没有找到相关文章

最新更新