所以我有以下xml(items.xml),我想找到子节点项的属性迭代通过属性,如果我在父节点级别找到类似的属性,用子节点属性替换相同的属性,并删除子属性除了名字.
- <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>
最终的xml应该是这样的
- <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>
以下是我试图访问父节点的代码
- [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:
- $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
现在对于每个属性,我只需要返回父节点,检查是否存在类似属性并将其替换为子节点属性
所以,我正在寻找类似的东西
- $model.SelectNodes("//item/@*") | foreach {($_.name).parentnode.parentnode.($_.name)} | <some code to replace parentnode attribute with child attribute>
- $model.SelectNodes("//item/@*") | where {$_.name -notlike "name"} | foreach {$_.Removeattribute()}
如果这两个都可以在一个令人敬畏的命令中完成
也许我也试图在一行中做很多事情
任何指针都非常感谢!
不确定我在这里做错了什么因为powershell不会为父节点使用而抛出错误但只是不打印任何东西.所有经验丰富的程序员都可以为您提供帮助!
您可以通过
OwnerElement
属性从属性中获取父元素.所以这是获得所需输出的一种可能方式:
- $model.SelectNodes("//item/@*") |
- ForEach {
- # set attributes value on `model` element
- $_.OwnerElement.ParentNode.ParentNode.SetAttribute($_.LocalName,$_.Value)
- # remove attributes except `name` from `item` element
- If ($_.LocalName -ne "name") { $_.OwnerElement.RemoveAttribute($_.LocalName) }
- }