[英]Using Powershell to edit XML file
我有一个 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:@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>
如何更改四个地方的module-option
中的字符串“jdbc:oracle:thin:@hostname:1521/test”。
该字符串始终相同,并且将从同一个变量中替换四次。
以下是我尝试过的,但它只是更改了实际名称“dbUrl”,而且只是第一次。
$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)
下面是我希望 output 的样子。
<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>
如果您想要所有这些,请使用SelectNodes()
而不是SelectSingleNode()
,并确保写入InnerText
属性而不是Name
:
foreach($urlNode in $doc.SelectNodes("/policy/application-policy/authentication/login-module/module-option[@name='dbUrl']")){
$urlNode.InnerText = "jdbc:oracle:thin:@hostname1:1521/test1"
}
您可以首先迭代每个<application-policy>
节点,然后迭代每个<module-option>
节点,并且只将InnerText
设置为name="dbUrl"
的新连接字符串。
演示:
# 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>
像这样加载您的 XML 文件$doc = (gc $configPath) -as [xml]
将 xml 存储在 var.. 中后,现在您可以读取和替换数据
$doc.SelectSingleNode('//connectionStrings/add[@name="'+ $connectionName +'"]/@connectionString').'#text' = $connectionString
$doc.Save($configPath)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.