Удаление ребенка в XML с помощью PowerShell? - PullRequest
0 голосов
/ 21 ноября 2018

Я обыскал все место, чтобы найти ответ на этот вопрос, но, похоже, я не могу найти тот, который подходит мне, и да, я знаю, что об этом спрашивали много, но ничего не работает.

Это мой код:

$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 голосов
/ 23 ноября 2018

Возможно, я нашел что-то, что работает ... Я снова использовал данные по вашей ссылке.

$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 разных формата.

Надеюсь, это поможет!

0 голосов
/ 23 ноября 2018

Ошибка 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(), вы можете передать его на нуль:

$Node.ParentNode.RemoveChild($Node) | Out-Null
0 голосов
/ 21 ноября 2018

Не знаю, поможет ли это вам, но вот что я сделал.Я использовал данные по вашей ссылке:

<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

Надеюсь, это поможет. * * 1007

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...