gpt4 book ai didi

xml - 使用Powershell修改通过子属性迭代的XML父属性

转载 作者:行者123 更新时间:2023-12-03 00:46:45 26 4
gpt4 key购买 nike

因此,我具有以下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) }
}

关于xml - 使用Powershell修改通过子属性迭代的XML父属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42868790/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com