1

I have an XML file that I need to amend the connection string within. Below is an example of the file.

<policy>
  <application-policy name="Part1">
    <authentication>
      <login-module code="jboss.loginmodule" flag="required">
        <module-option name="allowEmptyPasswords">false</module-option>
        <module-option name="dbUrl">jdbc:oracle:thin:@hostname:1521/test=</module-option>
      </login-module>
    </authentication>
  </application-policy>
  <application-policy name="Part2">
    <authentication>
      <login-module code="jboss.loginmodule" flag="required">
        <module-option name="allowEmptyPasswords">false</module-option>
        <module-option name="dbUrl">jdbc:oracle:thin:@hostname:1521/test=</module-option>
      </login-module>
    </authentication>
  </application-policy>
  <application-policy name="Part3">
    <authentication>
      <login-module code="jboss.loginmodule" flag="required">
        <module-option name="allowEmptyPasswords">false</module-option>
        <module-option name="dbUrl">jdbc:oracle:thin:@hostname:1521/test=</module-option>
      </login-module>
    </authentication>
  </application-policy>
  <application-policy name="Part4">
    <authentication>
      <login-module code="jboss.loginmodule" flag="required">
        <module-option name="allowEmptyPasswords">false</module-option>
        <module-option name="dbUrl">jdbc:oracle:thin:@hostname:1521/test</module-option>
      </login-module>
    </authentication>
  </application-policy>
</policy>

How can I change the string "jdbc:oracle:thin:@hostname:1521/test" that comes within module-option in the four places.

The string is always the same and will be replaced four times from the same variable.

Below is what I have tried but it is only changing the actually name "dbUrl" and only the first time.

$xmlFile = "C:\Users\Dan\Desktop\login-Config.xml"
[xml]$doc = Get-Content $xmlFile
$node = $doc.SelectSingleNode("/policy/application-policy/authentication/login-module/module-option[@name='dbUrl']")
$node.name = "jdbc:oracle:thin:@hostname1:1521/test1"
$doc.Save($xmlFile)

Below is what I would like the output to look like.

<policy>
  <application-policy name="Part1">
    <authentication>
      <login-module code="jboss.loginmodule" flag="required">
        <module-option name="allowEmptyPasswords">false</module-option>
        <module-option name="dbUrl">jdbc:oracle:thin:@hostname1:1521/test1/test=</module-option>
      </login-module>
    </authentication>
  </application-policy>
  <application-policy name="Part2">
    <authentication>
      <login-module code="jboss.loginmodule" flag="required">
        <module-option name="allowEmptyPasswords">false</module-option>
        <module-option name="dbUrl">jdbc:oracle:thin:@hostname1:1521/test1/test=</module-option>
      </login-module>
    </authentication>
  </application-policy>
  <application-policy name="Part3">
    <authentication>
      <login-module code="jboss.loginmodule" flag="required">
        <module-option name="allowEmptyPasswords">false</module-option>
        <module-option name="dbUrl">jdbc:oracle:thin:@hostname1:1521/test1/test=</module-option>
      </login-module>
    </authentication>
  </application-policy>
  <application-policy name="Part4">
    <authentication>
      <login-module code="jboss.loginmodule" flag="required">
        <module-option name="allowEmptyPasswords">false</module-option>
        <module-option name="dbUrl">jdbc:oracle:thin:@hostname1:1521/test1/test</module-option>
      </login-module>
    </authentication>
  </application-policy>
</policy>
0

3 Answers 3

2

Use SelectNodes() instead of SelectSingleNode() if you want all of them, and make sure you write to the InnerText property rather than Name:

foreach($urlNode in $doc.SelectNodes("/policy/application-policy/authentication/login-module/module-option[@name='dbUrl']")){
  $urlNode.InnerText = "jdbc:oracle:thin:@hostname1:1521/test1"
}
Sign up to request clarification or add additional context in comments.

2 Comments

Well that surely is a lot more direct than my answer +1
@Mathias R. Jessen, thanks this did exactly what I needed.
1

You could first iterate every <application-policy> node, then iterate every <module-option> node and only set InnerText to the new connectionstring with name="dbUrl".

Demo:

# Create XML object from file
[xml]$xml = Get-Content -Path "test.xml"

# Iterate each policy node
foreach ($policy in $xml.policy.ChildNodes)
{
    # Iterate each module option node
    foreach ($moduleOption in $policy.authentication.'login-module'.'module-option')
    {
        # Only the dbUrl module option
        if ($moduleOption.name -eq "dbUrl")
        {
            $moduleOption.InnerText = "jdbc:oracle:thin:@hostname1:1521/test1/test"
        }
    }
}

# Save to output XML file
$xml.Save("output.xml")

output.xml

<policy>
  <application-policy name="Part1">
    <authentication>
      <login-module code="jboss.loginmodule" flag="required">
        <module-option name="allowEmptyPasswords">false</module-option>
        <module-option name="dbUrl">jdbc:oracle:thin:@hostname1:1521/test1/test</module-option>
      </login-module>
    </authentication>
  </application-policy>
  <application-policy name="Part2">
    <authentication>
      <login-module code="jboss.loginmodule" flag="required">
        <module-option name="allowEmptyPasswords">false</module-option>
        <module-option name="dbUrl">jdbc:oracle:thin:@hostname1:1521/test1/test</module-option>
      </login-module>
    </authentication>
  </application-policy>
  <application-policy name="Part3">
    <authentication>
      <login-module code="jboss.loginmodule" flag="required">
        <module-option name="allowEmptyPasswords">false</module-option>
        <module-option name="dbUrl">jdbc:oracle:thin:@hostname1:1521/test1/test</module-option>
      </login-module>
    </authentication>
  </application-policy>
  <application-policy name="Part4">
    <authentication>
      <login-module code="jboss.loginmodule" flag="required">
        <module-option name="allowEmptyPasswords">false</module-option>
        <module-option name="dbUrl">jdbc:oracle:thin:@hostname1:1521/test1/test</module-option>
      </login-module>
    </authentication>
  </application-policy>
</policy>

1 Comment

Thanks for your response, this is actually very useful for me in other places so its nice to see how you drill down to the specific level.
0

Load your XML file like this $doc = (gc $configPath) -as [xml]

After storing xml in var.. now you can read and replace data

   $doc.SelectSingleNode('//connectionStrings/add[@name="'+ $connectionName +'"]/@connectionString').'#text' = $connectionString

   $doc.Save($configPath)

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.