繁体   English   中英

使用 Powershell 编辑 XML 文件

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM