Вот пример того, как это сделать с помощью командлета Group-Object
.Он сгруппирует элементы xcopy по Destination
и объединит пути Include
в строку, разделенную точкой с запятой.Вывод сохраняется в новом XML-документе и сохраняется на диске.Это не обновляет программно оригинал.Вы можете просто скопировать и вставить новый консолидированный XML поверх исходного XML.
Обновление Теперь, когда я вижу весь ваш файл, я вижу, что у него есть пространство имен по умолчанию, которое вызывает проблемы с XPath.Есть два способа обойти эту проблему.
- Использование независимого от пространства имен xpath
- Использование диспетчера пространства имен
Вот обновленный пример использования независимого пространства имен xpath.Также для получения требуемого отступа нам потребуется выполнить некоторую обработку текстового файла после обработки объекта XML.
$xml="Myinput.xml"
$tempXmlFile = "C:\New.xml"
$outXml = New-Object System.Xml.XmlDocument
$outXml.AppendChild($outXml.CreateElement("root")) > $null
$x = [xml] (Get-Content $xml)
$x.SelectNodes("//*[local-name()='Xcopy']") | Group-Object Destination | % {
$includePaths = ($_.Group | Select-Object -ExpandProperty Include) -join ";"
$element = $outXml.CreateElement("Xcopy")
$element2 = $outXml.CreateElement("Destination")
$element2.InnerText = $_.Name
$element.AppendChild($element2) > $null
$element.SetAttribute("Include", $includePaths)
$outXml.DocumentElement.AppendChild($element) > $null
}
$outXml.Save($tempXmlFile)
$data = Get-Content $tempXmlFile | % {
$search = 'Include="'
$index = $_.IndexOf('Include="')
if ($index -gt 0) {
$spaces = ( ' ' * ($index + $search.length) )
}
$_ -replace ';', ";`n${spaces}"
}
$data | Set-Content $tempXmlFile
& notepad $tempXmlFile
Создает вывод:
<root>
<Xcopy Include="..\..\..\Release\UtilitiesAssembly.dll
..\..\..\Release\Core.assembly.dll">
<Destination>"..\..\..\Mycomponent\depl\BOM\Folder1</Destination>
</Xcopy>
<Xcopy Include="..\..\..\Release\UIAssembly.dll">
<Destination>"..\..\..\Anothercomponent\Folder1</Destination>
</Xcopy>
<Xcopy Include="..\..\..\Release\Core.assembly.dll">
<Destination>"..\..\..\Anothercomponent\depl\BOM</Destination>
</Xcopy>
</root>