删除Powershell中具有重复XML元素的节点
我有一个如下所示的xml:删除Powershell中具有重复XML元素的节点,xml,powershell,Xml,Powershell,我有一个如下所示的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="thi
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
$myfile.myobjects.allobjects.childNodes | where-object{$myfile.myobjects.allobjects.object.special | sort-object | get-Unique`} |foreach-Object{ do my deletion function}
接下来我要做的是删除specialLine
值相同的每个节点(对于每个完全相同的specialLine
,只保留一个节点)。使用此$myfile.myobjects.allobjects.object.special | sort object | get unique
我就是找不到一种方法来删除节点并保留具有唯一特殊线的节点。我试过这样的方法:
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
$myfile.myobjects.allobjects.childNodes | where-object{$myfile.myobjects.allobjects.object.special | sort-object | get-Unique`} |foreach-Object{ do my deletion function}
但我认为我遗漏了一些东西,或者我的方法是完全错误的。如有任何建议或帮助,将不胜感激 您可以结合使用
specialLine
属性上的和的-Skip
参数来选择要删除的节点
$nodesToRemove = $myfile.myobjects.allobjects.childnodes | Group-Object specialLine |
Foreach-Object { $_.Group | Select-Object -Skip 1 }
$nodesToRemove | Foreach-Object {
$myfile.myobjects.allobjects.RemoveChild($_)
}
想法是跳过每组中的第一个对象(
specialLine
value)。如果一个组是唯一的,则将跳过整个组。这很有效!关于跳过每组中第一个对象的精彩解释!这帮助我概念化了我所缺少的东西。