Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
删除Powershell中具有重复XML元素的节点_Xml_Powershell - Fatal编程技术网

删除Powershell中具有重复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

我有一个如下所示的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
$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)。如果一个组是唯一的,则将跳过整个组。

这很有效!关于跳过每组中第一个对象的精彩解释!这帮助我概念化了我所缺少的东西。