L oop через узлы и изменение древовидной структуры xml - PullRequest
2 голосов
/ 09 июля 2020

Я пытаюсь изменить xml файл с одной структуры на другую, используя только несколько вещей, которые мне нужны, с помощью PowerShell. Исходный файл выглядит так:

<?xml version="1.0" encoding="iso-8859-1"?>
<Files xmlns="http://testnamespace.com">
  <File>
    <Naam>filenameone.XML</Naam>
    <Type>testtype</Type>
    <Lines>15</Lines>
  </File>
  <File>
    <Name>filenametwo.XML</Name>
    <Type>Journaalposten</Type>
    <Lines>3</Lines>
  </File>
  <Amount>0,00</Amount>
  <Indication>D</Indication>
</Files>

И идея состоит в том, чтобы преобразовать его в это:

<?xml version="1.0" encoding="iso-8859-1"?>
<Files xmlns="http://testnamespace.com">
  <File>filenameone.XML</File>
  <File>filenametwo.XML</File>
</Files>

В настоящее время у меня есть все необходимое, чтобы забрать файл и все такое, Я просто хочу изменить структуру xml и сохранить файл. Я не знаю, лучше ли написать новый файл или l oop через элементы и изменить их, как I go, это то, что у меня сейчас есть:

$transportFile = Get-ChildItem -Path $currentLocation -Filter *transport*
[xml]$xml = Get-Content -Path $transportFile
$nsm = New-Object Xml.XmlNamespaceManager($xml.NameTable)
$nsm.AddNamespace('ns', $xml.DocumentElement.NamespaceURI)
$ParametersNode = $xml.SelectNodes('//ns:Files', $nsm)

foreach($Node in $ParametersNode){
   #Do something to transform the current node
}
$xml.Save('test.xml')

1 Ответ

2 голосов
/ 09 июля 2020

Я бы посоветовал вам сделать это по-другому.

Создайте новый пустой файл, найдите информацию о цели в старом файле и добавьте ее в новый. Примерно так:

$oldfile = [xml]'[[[your xml above]]]'

$newfile = [xml]'<?xml version="1.0" encoding="iso-8859-1"?>
<Files xmlns="http://testnamespace.com">  
</Files>'

$targets = $oldfile.SelectNodes("//*[local-name()='Files']/*[local-name()='File']/*[local-name()='Name']/text()").InnerText 

foreach ($target in $targets)    
{  
  $entry = $newfile.CreateElement("File","http://testnamespace.com")  
  $entry.InnerText=$target
  $newfile.Files.AppendChild($entry) 
}
echo $newfile.OuterXml

Вывод (извините за форматирование, но это можно исправить позже):

<?xml version="1.0" encoding="iso-8859-1"?>
<Files xmlns="http://testnamespace.com">
<File>filenameone.XML</File><File>filenametwo.XML</File>
</Files>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...