Tengo un archivo XML en el que necesito modificar la cadena de conexión. A continuación se muestra un ejemplo del archivo.

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

¿Cómo puedo cambiar la cadena "jdbc: oracle: thin: @hostname: 1521 / test" que viene dentro de module-option en los cuatro lugares.

La cadena es siempre la misma y será reemplazada cuatro veces por la misma variable.

A continuación se muestra lo que he intentado, pero solo está cambiando el nombre real "dbUrl" y solo la primera vez.

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

A continuación se muestra cómo me gustaría que se vea la salida.

<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
Daniel 22 abr. 2020 a las 12:52

3 respuestas

La mejor respuesta

Utilice SelectNodes() en lugar de SelectSingleNode() si quieres todos, y asegúrate de escribir en la propiedad InnerText en lugar de Name:

foreach($urlNode in $doc.SelectNodes("/policy/application-policy/authentication/login-module/module-option[@name='dbUrl']")){
  $urlNode.InnerText = "jdbc:oracle:thin:@hostname1:1521/test1"
}
2
Mathias R. Jessen 22 abr. 2020 a las 10:21

Primero puede iterar cada nodo <application-policy>, luego iterar cada nodo <module-option> y solo establecer InnerText en la nueva cadena de conexiones con name="dbUrl".

Demostración:

# 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
RoadRunner 22 abr. 2020 a las 10:19

Cargue su archivo XML como este $ doc = (gc $ configPath) -as [xml]

Después de almacenar xml en var .. ahora puede leer y reemplazar datos

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

   $doc.Save($configPath)
0
Biren 22 abr. 2020 a las 11:40