Как добавить количество узлов в файле XML? - PullRequest
1 голос
/ 19 сентября 2019

У меня есть XML-файл, в котором мне нужно найти количество узлов и заменить его на n таких же узлов.

Это мой входной 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">
<DbType>Sql</DbType>
<!--<DbType>Oracle</DbType>-->
  <PcNames>
    <anyType xsi:type="xsd:string">\\localhost</anyType>
    <anyType xsi:type="xsd:string">\\localhost</anyType>
    <anyType xsi:type="xsd:string">\\localhost</anyType>
  </PcNames> 
</VOSettings>

Ожидаемый вывод файла xml должен содержать n данных внутри узла PcNames.В настоящее время у него есть 3 значения внутри PcNames, в моем выходном файле должно быть n из этих значений. Как решить эту проблему?

Ответы [ 2 ]

1 голос
/ 19 сентября 2019

В соответствии с моим пониманием вашего вопроса, надеюсь, это поможет.

$azVMInventoryList=@() #add n number of element/node in this list
$file=Get-Content -Path "C:\path of the file" 
$lineNumber=($file | Measure-Object).Count
$finalList=@()
$i=0

    for($j=0;$j -lt $lineNumber;$J++){
        if($file[$j] -ne "<PcNames>"){
            $finalList=$finalList+$file[$j]
        }
        if($file[$j] -eq "<PcNames>"){
            $finalList=$finalList+$file[$j]
            $i=$j
            break
        }
    }
    $finalList=$finalList+$azVMInventoryList
    for($k=$i+1;$k -le $lineNumber;$k++){
        if($file[$k] -match "</PcNames>"){
            for($l=$k;$l -le $lineNumber;$l++){
                $finalList=$finalList+$file[$l]
            }
            break
        }
    }
$finalList | Set-Content -Path "C:\path of the file"

PS: Игнорируйте именование переменных, и вам может потребоваться немного редактирования в соответствии с вашими потребностями.

1 голос
/ 19 сентября 2019

Если мы предполагаем, что структура вашего узла 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.

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