我已经在所有地方搜索过,找到了答案,但是似乎找不到适合我的答案,是的,我知道这个问题被问了很多,但是没有用。
这是我的代码:
$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仅支持该功能,我确实遇到了麻烦,需要一些帮助:)
答案 0 :(得分:1)
出现错误Collection was of a fixed size.
表示您可能正在使用collections \ arrays而不是XML Element。
您可以将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
答案 1 :(得分:0)
我不知道这是否对您有帮助,但这就是我所做的。我使用了您链接中的数据:
<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:\Users\b.moeskops\Desktop\test.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
我希望这会有所帮助。
答案 2 :(得分:0)
我可能已经找到了行之有效的方法... 我再次使用了您链接中的数据。
$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文件的两行,我这样做是因为在文件内找到2种不同的格式。
希望这会有所帮助!