是否通过PowerShell删除XML中的子项



我已经搜索了所有的地方来找到这个问题的答案,但我似乎找不到一个适合我的答案,是的,我知道这个问题被问了很多,但都不起作用。

这是我的代码:

$Request = Invoke-RestMethod ($BaseURL + $StatPage) -WebSession  $Session -Method Post -Body $StatBody
$Request = $Request | Where-Object {$_.'mac' -ne "00:00:00:00:00:00"}

我甚至尝试过:

foreach($Node in $Request.'ajax-response'.response.'acl-list'.acl.deny)
{
if($Node.'mac' -eq "00:00:00:00:00:00")
{
$Node.ParentNode.RemoveNode($Node)
}
}

这产生了好的旧错误:Collection was of a fixed size.

我已经尝试了其他一些,但不再有代码,MAC是有效的,并且在列表中,并通过保存和检查验证了这一点。

以下是一些示例XML

我需要使用XML,因为API只支持这一点,我真的遇到了困难,希望得到一些帮助:(

出现错误Collection was of a fixed size.表明您可能使用的是集合\数组,而不是XML元素。

您可以将Invoke-RestMethod输出显式转换为XmlDocument:

[xml] $Request = Invoke-RestMethod ($BaseURL + $StatPage) -WebSession  $Session -Method Post -Body $StatBody

并在要删除的节点上调用方法RemoveChild()

foreach($Node in $Request.'ajax-response'.response.'acl-list'.acl.deny)
{
if($Node.'mac' -eq "00:00:00:00:00:00")
{
$Node.ParentNode.RemoveChild($Node)
}
}

如果您对RemoveChild()给出的输出不感兴趣,可以将其管道传输到null:

$Node.ParentNode.RemoveChild($Node) | Out-Null

我不知道这是否会对你有所帮助,但以下是我所做的。我使用了您链接中的数据:

<ajax-request action="updobj" comp="acl-list" updater="blocked-clients">
<acl id="1" name="System" description="System" default-mode="allow" EDITABLE="false">
<deny type="single" mac="c0:bd:d1:14:62:68"/>
<deny mac="c0:d3:c0:1c:60:93" type="single"/>
<deny type="single" mac="b4:74:43:c0:f3:cf"/>
<deny type="single" mac="c0:ee:fb:25:ca:7c"/>
<deny type="single" mac="48:db:50:ed:71:36"/>
<deny mac="d4:50:3f:fd:48:2f" type="single"/>
<deny type="single" mac="58:48:22:c2:44:2e"/>
</acl>
</ajax-request>

然后我做了以下操作,只需循环浏览数据并创建没有不需要的mac的新文件:

[xml]$xml = Get-Content "C:Usersb.moeskopsDesktoptest.xml"
$data = $xml.'ajax-request'.acl.deny
$wrongData = "c0:d3:c0:1c:60:93"
foreach($Node in $data){
if($Node.'mac' -eq $wrongData){
$data = $data | Where-Object {$_.mac -ne $wrongData} 
}
}
$data

我希望这能有所帮助。

我可能找到了一些有效的东西。。。我再次使用了您链接中的数据。

$Path = "H:test.xml"
$xml = Get-Content $Path
$array = $xml | ConvertTo-Json | ConvertFrom-Json
foreach($obj in $array.value){
if($obj -match '<deny type="single" mac="c0:bd:d1:14:62:68"/>' -or $obj -match '<deny mac="c0:d3:c0:1c:60:93" type="single"/>'){
$array2 = $array.value | Where-Object {$_ -ne $obj}
}
}
$array2

第一个文件:

<ajax-request action="updobj" comp="acl-list" updater="blocked-clients">
<acl id="1" name="System" description="System" default-mode="allow" EDITABLE="false">
<deny type="single" mac="c0:bd:d1:14:62:68"/>
<deny mac="c0:d3:c0:1c:60:93" type="single"/>
<deny type="single" mac="b4:74:43:c0:f3:cf"/>
<deny type="single" mac="c0:ee:fb:25:ca:7c"/>
<deny type="single" mac="48:db:50:ed:71:36"/>
<deny mac="d4:50:3f:fd:48:2f" type="single"/>
<deny type="single" mac="58:48:22:c2:44:2e"/>
</acl>
</ajax-request>

此文件保存在"H:\test.xml"。运行脚本后,$array2的输出为:

$array2
<ajax-request action="updobj" comp="acl-list" updater="blocked-clients">
<acl id="1" name="System" description="System" default-mode="allow" EDITABLE="false">
<deny type="single" mac="c0:bd:d1:14:62:68"/>
<deny type="single" mac="b4:74:43:c0:f3:cf"/>
<deny type="single" mac="c0:ee:fb:25:ca:7c"/>
<deny type="single" mac="48:db:50:ed:71:36"/>
<deny mac="d4:50:3f:fd:48:2f" type="single"/>
<deny type="single" mac="58:48:22:c2:44:2e"/>
</acl>
</ajax-request>

如果您检查该文件,您可以看到我已经从文件中删除了内容,并保持了格式不变。

正如您所看到的,我删除了XML文件的两行,我这样做是因为在文件中有两种不同的格式。

希望这能有所帮助!

最新更新