Modifique los atributos primarios XML iterando a través de los atributos secundarios utilizando powershell
Por lo tanto, tengo el siguiente xml (items.xml) y quiero encontrar los atributos del elemento del nodo secundario iterar a través de los atributos y si encuentro atributos similares a nivel del nodo primario, reemplazar lo mismo con los atributos del nodo secundario y eliminar los atributos secundarios aparte del nombre.
<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>
El xml final debería verse así
<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>
Puedo obtener los atributos en el nivel secundario, pero no puedo volver al nodo primario desde el nivel secundario.
El siguiente es el código que intenté llegar a los nodos principales
[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:
Puedo obtener los nombres de atributo del nodo hijo de la siguiente manera:
$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
Ahora para cada atributo, solo necesito volver al nodo principal, verificar si existe un atributo similar y reemplazarlo con el atributo del nodo secundario
Entonces, estoy buscando algo como
$model.SelectNodes("//item/@*") | foreach {($_.name).parentnode.parentnode.($_.name)} | <some code to replace parentnode attribute with child attribute>
Luego, para eliminar los atributos secundarios, algo así como
$model.SelectNodes("//item/@*") | where {$_.name -notlike "name"} | foreach {$_.Removeattribute()}
y si ambos se pueden hacer en un solo comando eso sería genial
Tal vez también estoy tratando de hacer muchas cosas en una sola línea
Cualquier puntero es muy apreciado! No estoy realmente seguro de qué estoy haciendo mal aquí, ya que powershell no arroja un error para el uso del nodo principal, pero simplemente no imprime nada. ¡Cualquier ayuda es increíble de parte de todos los programadores experimentados!