循环遍历节点并更改树结构xml



我正试图将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结构并保存文件。我不知道是写一个全新的文件更好,还是循环浏览元素并在进行更改时更好——这就是我目前拥有的:

$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')

我建议您用另一种方法。

创建一个新的空白文件,在旧文件中搜索目标信息,并将其附加到新文件中。类似这样的东西:

$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>

最新更新