首页 > 解决方案 > 在 Powershell 中删除具有重复 XML 元素的节点

问题描述

我有一个看起来像这样的 xml:

myobjects>
<allobjects>
<object name="firstObject" username="usr" pass="pass" specialLine="E:\folder1\files for home  /c /x /waitsecs 30 " default="Yes" binary="1"/>
<object name="secondObjec" username="usr1" pass="thispass" specialLine="E:\folder1\files for home  /c /x /waitsecs 30 " default="no" binary="1" />
<object name="thirdObject" username="usr2" pass="pass1" specialLine="E:\folder1\files for home  /c /x /waitsecs 40 " default="Yes" binary ="0" />
<object name="fourthObject" username="usr3" pass="pass3" specialLine="D:\folder1\files for office  /c /x /waitsecs 50 " default="Yes"  binary="1"/>
<object name="firstobject 1" username="usr4" pass="pass5" specialLine="E:\folder1\files for home  /c /x /waitsecs 30 " default="Yes" binary="0"/>
</allobjects>
<myobjects

我想删除每个元素的值"binary="0",我可以使用以下方法轻松完成where-Object

[xml]$myfile = [xml](Get-content path_to_my_file)
 $myfile.myobjects.allobjects.childNodes | where-object{$_.binary -eq 0} |foreach-Object{ do my deletion function}

我接下来要做的是删除specialLine值相同的每个节点(每个完全相同的节点只保留一个节点specialLines)。specialLines我可以用这个变得独一无二$myfile.myobjects.allobjects.object.special | sort-object | get-Unique

而且我只是找不到删除节点并保留具有唯一特殊线的节点的方法。我试过这样的事情:

$myfile.myobjects.allobjects.childNodes | where-object{$myfile.myobjects.allobjects.object.special | sort-object | get-Unique`} |foreach-Object{ do my deletion function}

但我认为我遗漏了一些东西,或者我的处理方法是完全错误的。任何建议或帮助将不胜感激。

标签: xmlpowershell

解决方案


您可以结合使用属性上的Group-ObjectspecialLineSelect-Object-Skip参数来选择要删除的节点。

$nodesToRemove = $myfile.myobjects.allobjects.childnodes | Group-Object specialLine |
    Foreach-Object { $_.Group | Select-Object -Skip 1 }

$nodesToRemove | Foreach-Object {
    $myfile.myobjects.allobjects.RemoveChild($_)
}

这个想法是跳过每个组中的第一个对象(specialLine值)。如果一个组是唯一的,则将跳过整个组。


推荐阅读