У меня есть xml-файл с содержимым, подобным приведенному ниже. Хотите прочитать приведенный ниже файл как xml, а затем обновите переменную без двух содержимых, у которых есть Validate="false" I it. Я не собираюсь сохранять содержимое этого нового xml обратно.
Спасибо
только понял, как анализировать содержимое, которое не является валидным = ложным
$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>
Это даст вам желаемый результат:
$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
. Однако у вас не будет отступов или новых строк.