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