Нужна помощь в преобразовании 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
Мне нужен следующий формат
1 ответ
В вычисляемых свойствах, заданных какSelect-Object
аргументы,$_.member
создает массив из всех элементов (из-за перечисления доступа к членам ), поэтому ваш CSV содержит несколько значений свойств для каждого поля.
Вместо этого вы хотите спуститься к элементам, уже находящимся в цепочке доступа к первому члену:
$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 ) вычисляемого свойства , как я сделал выше.
- Вы можете опустить запятую в подвыражении массива
@(…)
, так как каждый элемент массива располагается на своей строке. Вам нужна только запятая при указании нескольких элементов массива в строке. - The
$xml.app.childnodes.member
создает массив всехMember
элементы, содержащиеся в любом дочернем элементе подApp
элемент. Возможно, вы захотите ограничить перечислениеSecurityGroup
дочерние элементы, написав это следующим образом:$xml.App.SecurityGroup.Member