XML манипулирование в powershell - PullRequest
0 голосов
/ 09 апреля 2019

У меня есть xml-файл с содержимым, подобным приведенному ниже. Хочу прочитать приведенный ниже файл как xml, а затем обновить переменную без содержимого 2, имеющего Validate = "false" I it.Я не собираюсь сохранять содержимое этого нового XML-файла обратно.

спасибо

только выяснил, как разобрать содержимое, которое не проверено = false

$pngXml.NG.DeviceInterfaceLinks.DeviceInterfaceLink | ForEach-Object { if (!$psitem.HasAttribute('Va
lidate')){$psitem} }

Фактическое xml

<?xml version="1.0"?>
<NG>
  <Devices>
    <Device xsi:type="Access" Host="ABC1" Hwku="Test1" />
    <Device xsi:type="Access" Host="ABC2" Hwku="Test1" />
    <Device xsi:type="Access" Host="ABC3" Hwku="Test1" />   
  </Devices>
  <DeviceInterfaceLinks>    
    <DeviceInterfaceLink xsi:type="DeviceInterfaceLink" StartDevice="ABD1" />
    <DeviceInterfaceLink xsi:type="DeviceInterfaceLink" StartDevice="ABD2" Validate="false" />
    <DeviceInterfaceLink xsi:type="DeviceInterfaceLink" StartDevice="ABD3"  Validate="false" />
   </DeviceInterfaceLinks>
</NG>

конечное состояние необходимой переменной:

<?xml version="1.0"?>
<NG>
  <Devices>
    <Device xsi:type="Access" Host="ABC1" Hwku="Test1" />
    <Device xsi:type="Access" Host="ABC2" Hwku="Test1" />
    <Device xsi:type="Access" Host="ABC3" Hwku="Test1" />   
  </Devices>
  <DeviceInterfaceLinks>    
    <DeviceInterfaceLink xsi:type="DeviceInterfaceLink" StartDevice="ABD1" />
  </DeviceInterfaceLinks>
</NG>

1 Ответ

0 голосов
/ 09 апреля 2019

Это даст вам желаемый результат:

$x = [xml]'<?xml version="1.0"?>
<NG>
  <Devices>
    <Device type="Access" Host="ABC1" Hwku="Test1" />
    <Device type="Access" Host="ABC2" Hwku="Test1" />
    <Device type="Access" Host="ABC3" Hwku="Test1" />   
  </Devices>
  <DeviceInterfaceLinks>    
    <DeviceInterfaceLink type="DeviceInterfaceLink" StartDevice="ABD1" />
    <DeviceInterfaceLink type="DeviceInterfaceLink" StartDevice="ABD2" Validate="false" />
    <DeviceInterfaceLink type="DeviceInterfaceLink" StartDevice="ABD3"  Validate="false" />
   </DeviceInterfaceLinks>
</NG>'

Foreach ($node in $x.SelectNodes("//DeviceInterfaceLink[@Validate='false']")) {
  $x.SelectNodes("//DeviceInterfaceLinks").removechild($node) | out-null
}

$sw = [System.IO.StringWriter]::new()
$xw = [System.Xml.XmlTextWriter]::new($sw)
$xw.Formatting = "indented"
$x.WriteContentTo($xw)
$xw.flush()
$sw.flush()
$sw.ToString()

Я решил сохранить ваше XML-содержимое в переменной $x.Я заменил xsi:type, потому что это кажется ненужным, и моему редактору не понравился синтаксис.Вы всегда можете добавить его обратно с помощью операции замены.

Я выбираю узлы, в которых элемент DeviceInterfaceLink содержит атрибут Validate, равный false.Затем я перебираю эту коллекцию с foreach и удаляю эти узлы из DeviceInterfaceLinks, используя RemoveChild().

. Объекты StringWriter и XmlTextWriter предназначены только для форматирования.Без них вы могли бы просто получить данные строки XML с помощью $x.outerxml.Однако у вас не будет отступов или новых строк.

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