Search code examples
xmlpowershell

Replace a node value with updated value using PowerShell


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)

Solution

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