在 PowerShell 中写入嵌套 XML 元素时遇到问题

Trouble writing nested XML elements in PowerShell

我有一个应用程序有一个 XML 格式的配置文件。我创建了一个 powershell 脚本,允许用户从多个配置更改中 select,而无需手动编辑配置。它适用于单个元素。例如,如果您选择下面的“Config 1”,它将完全按预期工作。它会找到任何匹配的元素,例如 fruit 并替换该行。伟大的。但是,如果配置元素有子元素,它会去掉 XML 并将其全部作为一个值。例如,如果您 select 下面的“Config 2”,它会这样写:

<fruit>banana</fruit>
<drink>tea</drink>
<dishes>forkbowl</dishes>

我该如何解决这个问题?

这里是Configurations.xml

<EnvironmentData>
  <demo friendlyName="Config 1">
    <fruit>apple</fruit>
    <drink>Soda</drink>
  </demo>
  <demo friendlyName="Config 2">
    <fruit>banana</fruit>
    <drink>tea</drink>
      <dishes>
        <utensil>fork</utensil>
        <dish>bowl</dish>
      </dishes>
  </demo>
</EnvironmentData>

代码如下:

#load data into hash
$envVariableHash = @{}
$test = $envs.SelectNodes("//$envName")[0]
ForEach ($ele in $test.ChildNodes) {
    #Write-Host "$($ele.LocalName): $($ele.InnerText)"
    $envVariableHash.add($ele.LocalName, $ele.InnerText)
}

#read build config and replace matches
$buildConfigFile = [System.Xml.XmlDocument](Get-Content "$($config.localbuildspath)/$($buildName)/config.xml");
$buildConfig = $buildConfigFile.ConfigData;

ForEach ($ele in $buildConfig.ChildNodes) {
    if ($envVariableHash.ContainsKey($ele.LocalName)) {
        $ele.InnerText = $envVariableHash[$ele.LocalName]
        if ($isDev) { Write-Host "Updated $($ele.LocalName)" -ForegroundColor DarkGray }
    }
}
Write-Host "Saving File... " -NoNewline -ForegroundColor DarkGray
$buildConfigFile.Save("$($config.localbuildspath)/$($buildName)/config.xml")
Write-Host "Done" -ForegroundColor DarkGray

您正在使用 .InnerText to get the content of a node. But .InnerText only returns the values of its nodes. Use .InnerXml

  1. 将第 6 行从 $envVariableHash.add($ele.LocalName, $ele.InnerText) 更改为 $envVariableHash.add($ele.LocalName, $ele.InnerXml)
  2. 将第 15 行从 $ele.InnerText = ... 更改为 $ele.InnerXml = ...