I have an XML file, Which has multiple nodes. In that I need to get a particular node value and replace that node value with an updated value using PowerShell
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<flow-definition plugin="[email protected]_f">
<properties>
<jenkins.model.BuildDiscarderProperty>
<strategy>
<daysToKeep>60</daysToKeep>
<numToKeep>-1</numToKeep>
<artifactDaysToKeep>-1</artifactDaysToKeep>
<artifactNumToKeep>-1</artifactNumToKeep>
</strategy>
</jenkins.model.BuildDiscarderProperty>
<hudson.model.ParametersDefinitionProperty>
<parameterDefinitions>
<hudson.model.StringParameterDefinition>
<name>param2</name>
<description> </description>
<defaultValue>value2</defaultValue>
</hudson.model.StringParameterDefinition>
<hudson.model.StringParameterDefinition>
<name>ExtraParameters</name>
<description> </description>
<defaultValue>/_xyxz:12345 /_abc:678 /_pqr:string /_dcz:string2</defaultValue>
</hudson.model.StringParameterDefinition>
<hudson.model.BooleanParameterDefinition>
<name>param1</name>
<description> </description>
<defaultValue>false</defaultValue>
</hudson.model.BooleanParameterDefinition>
</parameterDefinitions>
</hudson.model.ParametersDefinitionProperty>
</properties>
<definition class="xyz" plugin="xyz">
<script>
</script>
<sandbox>true</sandbox>
</definition>
<triggers />
<disabled>true</disabled>
</flow-definition>
I am able to get the node value but not able to replace the value, I have tried below script but replace is not working
[xml] $ConfigFile = Get-Content 'D:\CP\Automation\test.xml'
$extraParam = ($ConfigFile.'flow-definition'.properties.'hudson.model.ParametersDefinitionProperty'.parameterDefinitions.'hudson.model.StringParameterDefinition' | Where-Object {$_.name -eq "ExtraParameters"}).defaultValue
Write-Host "ExtraParam is: $extraParam"
$updatedextraParam = "/_hello:abc $extraParam"
Write-Host "Updated ExtraParam is: $updatedextraParam"
($ConfigFile.'flow-definition'.properties.'hudson.model.ParametersDefinitionProperty'.parameterDefinitions.'hudson.model.StringParameterDefinition' | Where-Object {$_.name -eq "ExtraParameters"}).defaultValue.$updatedextraParam
or
#$ConfigFile -replace $extraParam, $updatedextraParam | Out-File -Encoding utf8 $ConfigFile
or
#$nodeMapper = ('flow-definition'.properties.'hudson.model.ParametersDefinitionProperty'.parameterDefinitions.'hudson.model.StringParameterDefinition' | Where-Object {$_.name -eq "ExtraParameters"}).defaultValue
#Select-Xml -xml $ConfigFile -XPath $nodeMapper | ForEach-Object { $_.Node.InnerXML = $updatedextraParam }
$ConfigFile.Save($ConfigFile)
It's not entirely clear but assuming you want to update:
<defaultValue>/_xyxz:12345 /_abc:678 /_pqr:string /_dcz:string2</defaultValue>
To:
<defaultValue>/_hello:abc/_xyxz:12345 /_abc:678 /_pqr:string /_dcz:string2</defaultValue>
Then you can try the following:
($xml = [xml]::new()).Load('path\to\theSource.xml')
# get the parent node `hudson.model.StringParameterDefinition` where
# the child node `name` has a value of `ExtraParameters`
$node = $xml.SelectSingleNode("//*/hudson.model.StringParameterDefinition[name='ExtraParameters']")
# update `defaultValue` to `/_hello:abc` + the value of this property
$node.defaultValue = '/_hello:abc' + $node.defaultvalue
# save this updated xml
$xml.Save('path\to\theResult.xml')