修改使用powershell迭代子属性的XML父属性

前端之家收集整理的这篇文章主要介绍了修改使用powershell迭代子属性的XML父属性前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
所以我有以下xml(items.xml),我想找到子节点项的属性迭代通过属性,如果我在父节点级别找到类似的属性,用子节点属性替换相同的属性,并删除属性除了名字.
  1. <items>
  2. <model type="model1" name="default" price="12.12" date="some_value">
  3. <PriceData>
  4. <item name="watch" price="24.28" date="2013-12-01" />
  5. </PriceData>
  6. </model>
  7. <model type="model2" name="default" price="12.12" date="some_value">
  8. <PriceData>
  9. <item name="toy" price="22.34" date="2013-12-02"/>
  10. </PriceData>
  11. </model>
  12. <model type="model3" name="default" price="12.12" date="some_value">
  13. <PriceData>
  14. <item name="bread" price="24.12" date="2013-12-03"/>
  15. </PriceData>
  16. </model>
  17. </items>

最终的xml应该是这样的

  1. <items>
  2. <model type="model1" name="watch" price="24.28" date="2013-12-0">
  3. <PriceData>
  4. <item name="watch" />
  5. </PriceData>
  6. </model>
  7. <model type="model2" name="toy" price="22.34" date="2013-12-02">
  8. <PriceData>
  9. <item name="toy" "/>
  10. </PriceData>
  11. </model>
  12. <model type="model3" name="bread" price="24.12" date="2013-12-03">
  13. <PriceData>
  14. <item name="bread" />
  15. </PriceData>
  16. </model>
  17. </items>

我能够在子级别获取属性,但是我无法从子级别遍历回父节点.

以下是我试图访问父节点的代码

  1. [xml]$model = get-content items.xml
  2. $model.SelectNodes("//item/@*")
  3.  
  4. Output:
  5.  
  6. #text
  7. -----
  8. watch
  9. 24.28
  10. 2013-12-01
  11. toy
  12. 22.34
  13. 2013-12-02
  14. bread
  15. 24.12
  16. 2013-12-03
  17.  
  18.  
  19. $model.SelectNodes("//item/@*") | foreach {write-host $_.parentnode}
  20.  
  21. No Output:
  22.  
  23. $model.SelectNodes("//item/@*") | foreach {write-host $_.parentnode.parentnode}
  24.  
  25. No Output:

我可以得到子节点的属性名称,如下所示:

  1. $model.SelectNodes("//item/@*") | foreach {write-host $_.name}
  2.  
  3. Output:
  4. PS C:\BIOS_Work_Dir\Kit_Manifest_test> $model.SelectNodes("//item/@*") | foreach {write-host $_.name}
  5. name
  6. price
  7. date
  8. name
  9. price
  10. date
  11. name
  12. price
  13. date

现在对于每个属性,我只需要返回父节点,检查是否存在类似属性并将其替换为子节点属性

所以,我正在寻找类似的东西

  1. $model.SelectNodes("//item/@*") | foreach {($_.name).parentnode.parentnode.($_.name)} | <some code to replace parentnode attribute with child attribute>

然后删除属性之类的东西

  1. $model.SelectNodes("//item/@*") | where {$_.name -notlike "name"} | foreach {$_.Removeattribute()}

如果这两个都可以在一个令人敬畏的命令中完成

也许我也试图在一行中做很多事情

任何指针都非常感谢!
不确定我在这里做错了什么因为powershell不会为父节点使用而抛出错误但只是不打印任何东西.所有经验丰富的程序员都可以为您提供帮助!

您可以通过 OwnerElement属性属性获取父元素.所以这是获得所需输出的一种可能方式:
  1. $model.SelectNodes("//item/@*") |
  2. ForEach {
  3. # set attributes value on `model` element
  4. $_.OwnerElement.ParentNode.ParentNode.SetAttribute($_.LocalName,$_.Value)
  5. # remove attributes except `name` from `item` element
  6. If ($_.LocalName -ne "name") { $_.OwnerElement.RemoveAttribute($_.LocalName) }
  7. }

猜你在找的XML相关文章