通过PowerShell删除XML中的子级?

时间:2018-11-21 04:32:45

标签: .net xml powershell

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

这是我的代码:

$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仅支持该功能,我确实遇到了麻烦,需要一些帮助:)

3 个答案:

答案 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种不同的格式。

希望这会有所帮助!