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>
3 respuestas
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"
}
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>
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)
Nuevas preguntas
xml
XML (Extensible Markup Language) es un formato de documento estructurado que define reglas de codificación de texto. Cuando utilice esta etiqueta, incluya etiquetas adicionales como lenguaje de programación, conjuntos de herramientas, tecnologías XML que se estén utilizando y otras etiquetas que describan el entorno del problema publicado. La flexibilidad de XML se presta a una amplia variedad de usos para la transferencia de datos de humanos y máquinas, así que sea específico en cuanto a herramientas y bibliotecas.