Если мы предполагаем, что структура вашего узла XML остается такой же, как в вашем примере, а n представляет общее количество узлов, которое вы хотите иметь (7 в этом примере кода), вы можете сделать следующее:
$n = 10
$xml = [xml](Get-Content x.xml)
if ($xml.SelectNodes("//PcNames/anyType[text() = '\\localhost']").count) {
$nodesToCopy = $xml.SelectNodes("//PcNames/anyType[text() = '\\localhost']")
$NumberOfCopies = $n - $nodesToCopy.count
$i = $nodesToCopy.Count - 1
} else {
$nodeTemplate = [xml]@'
<?xml version="1.0" encoding="UTF-8"?>
<VOSettings xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<PcNames>
<anyType xsi:type="xsd:string">\\localhost</anyType>
</PcNames>
</VOSettings>
'@
$nodesToCopy = $nodeTemplate.SelectNodes("//PcNames/anyType[text() = '\\localhost']")
$nodesTocopy = ,$xml.ImportNode($nodesToCopy[0],$true)
$NumberOfCopies = $n
$i = 1
}
$nodeParent = $xml.SelectSingleNode("//PcNames")
while ($NumberOfCopies -lt 0) {
[void]$nodeParent.RemoveChild($nodesToCopy[$i--])
$NumberOfCopies++
}
while ($NumberOfCopies -gt 0) {
$nodeClone = $nodesToCopy[0].CloneNode($true)
[void]$nodeParent.AppendChild($nodeClone)
$NumberOfCopies--
}
$xml.Save('c:\temp\new.xml')
Объяснение:
x.xml
- ваш исходный файл XML.Все узлы с именем anyType
, которые являются дочерними элементами PcNames
и содержат текст \\localhost
, выбраны, и это число установлено.$n
представляет n количество желаемых узлов.Всякий раз, когда n превышает число узлов, он добавляет клон одного из узлов в конец узла PcNames
.Всякий раз, когда n меньше числа узлов, он удаляет узел anyType
, начиная с вершины.Количество добавлений или удалений основано на разнице между n и количеством anyType
узлов.
Оператор if
обрабатывает ситуацию, когда ваш целевой узел уже копируетсясуществует в вашем XML-документе.Оператор else
содержит $nodeTemplate
, который представляет собой текст XML для нового узла, который вы хотите вставить.Случай else
- это когда у вас еще нет этого узла в документе XML.
new.xml
- это недавно обновленный вывод XML.