Modificar os atributos pai XML que iteram através dos atributos filhos usando o powershell
Portanto, tenho o seguinte xml (items.xml) e desejo localizar os atributos do item do nó filho iterados pelos atributos e, se encontrar atributos semelhantes no nível do nó pai, substitua o mesmo pelos atributos do nó filho e remova os atributos filhos diferente do nome.
<items>
<model type="model1" name="default" price="12.12" date="some_value">
<PriceData>
<item name="watch" price="24.28" date="2013-12-01" />
</PriceData>
</model>
<model type="model2" name="default" price="12.12" date="some_value">
<PriceData>
<item name="toy" price="22.34" date="2013-12-02"/>
</PriceData>
</model>
<model type="model3" name="default" price="12.12" date="some_value">
<PriceData>
<item name="bread" price="24.12" date="2013-12-03"/>
</PriceData>
</model>
</items>
O xml final deve ficar assim
<items>
<model type="model1" name="watch" price="24.28" date="2013-12-0">
<PriceData>
<item name="watch" />
</PriceData>
</model>
<model type="model2" name="toy" price="22.34" date="2013-12-02">
<PriceData>
<item name="toy" "/>
</PriceData>
</model>
<model type="model3" name="bread" price="24.12" date="2013-12-03">
<PriceData>
<item name="bread" />
</PriceData>
</model>
</items>
Consigo obter os atributos no nível filho, mas não consigo retornar ao nó pai a partir do nível filho.
A seguir está o código que tentei acessar os nós principais
[xml]$model = get-content items.xml
$model.SelectNodes("//item/@*")
Output:
#text
-----
watch
24.28
2013-12-01
toy
22.34
2013-12-02
bread
24.12
2013-12-03
$model.SelectNodes("//item/@*") | foreach {write-host $_.parentnode}
No Output:
$model.SelectNodes("//item/@*") | foreach {write-host $_.parentnode.parentnode}
No Output:
Posso obter os nomes dos atributos do nó filho da seguinte maneira:
$model.SelectNodes("//item/@*") | foreach {write-host $_.name}
Output:
PS C:\BIOS_Work_Dir\Kit_Manifest_test> $model.SelectNodes("//item/@*") | foreach {write-host $_.name}
name
price
date
name
price
date
name
price
date
Agora, para cada atributo, só preciso voltar ao nó pai, verificar se existe um atributo semelhante e substituí-lo pelo atributo do nó filho
Então, eu estou procurando algo como
$model.SelectNodes("//item/@*") | foreach {($_.name).parentnode.parentnode.($_.name)} | <some code to replace parentnode attribute with child attribute>
Em seguida, para remover os atributos filho, algo como
$model.SelectNodes("//item/@*") | where {$_.name -notlike "name"} | foreach {$_.Removeattribute()}
e se ambos puderem ser feitos em um único comando, isso seria incrível
Talvez eu também esteja tentando fazer muitas coisas em uma única linha
Todos os ponteiros são muito apreciados! Não tenho certeza do que estou fazendo de errado aqui, pois o PowerShell não gera um erro para o uso do nó pai, mas simplesmente não imprime nada. Qualquer ajuda é incrível de todos os seus programadores experientes !!