在PowerShell中更改XML节点中的所有键

时间:2018-01-14 08:54:53

标签: xml powershell

我有2个XML文件。两者几乎相同,但具有不同的键值。两者看起来都像下面的示例,但具有不同的值:

<SMSServerConf>
  <IP>localhost</IP>
  <Port>10010</Port>
  <Provider>3</Provider>
  <Link>192.168.0.146:2775</Link>
  <UserName>smppclient1</UserName>
  <Password>password</Password>
  <Apiid>smppclient1</Apiid>
  <Encoding>0</Encoding>
  <Ton>1</Ton>
  <Npi>1</Npi>
  <ValidityPeriod>20</ValidityPeriod>
  <ValidityPeriodEnable>true</ValidityPeriodEnable>
  <SenderName></SenderName>
</SMSServerConf>

目前,我使用以下代码将值从一个文件插入另一个文件:

$s_xml = [xml](Get-Content $s_location)
$d_xml = [xml](Get-Content $d_location)
$data = $s_xml.Configuration.SMSServerConf
$d_xml.Configuration.SMSServerConf.IP = $s_xml.Configuration.SMSServerConf.IP
$d_xml.Configuration.SMSServerConf.Port = $s_xml.Configuration.SMSServerConf.Port
$d_xml.Configuration.SMSServerConf.Provider = $s_xml.Configuration.SMSServerConf.Provider
$d_xml.Configuration.SMSServerConf.Link = $s_xml.Configuration.SMSServerConf.Link
$d_xml.Configuration.SMSServerConf.UserName = $s_xml.Configuration.SMSServerConf.UserName
$d_xml.Configuration.SMSServerConf.Password = $s_xml.Configuration.SMSServerConf.Password
$d_xml.Configuration.SMSServerConf.Apiid = $s_xml.Configuration.SMSServerConf.Apiid
$d_xml.Configuration.SMSServerConf.Encoding = $s_xml.Configuration.SMSServerConf.Encoding
$d_xml.Configuration.SMSServerConf.Ton = $s_xml.Configuration.SMSServerConf.Ton
$d_xml.Configuration.SMSServerConf.Npi = $s_xml.Configuration.SMSServerConf.Npi
$d_xml.Configuration.SMSServerConf.ValidityPeriod = $s_xml.Configuration.SMSServerConf.ValidityPeriod
$d_xml.Configuration.SMSServerConf.ValidityPeriodEnable = $s_xml.Configuration.SMSServerConf.ValidityPeriodEnable
$d_xml.Configuration.SMSServerConf.SenderName = $s_xml.Configuration.SMSServerConf.SenderName
$d_xml.Save($d_location)

此时看起来我每次添加或删除密钥时都必须维护脚本。是否可以只指示节点名称,然后遍历每个键并更改值而不是分别明确说明每个键?

1 个答案:

答案 0 :(得分:3)

如果您想要替换节点的整个内容,只需更换整个节点就更简单了:

[xml]$d_xml = Get-Content $d_location
[xml]$s_xml = Get-Content $s_location

$n1 = $d_xml.SelectSingleNode('/Configuration/SMSServerConf')
$n2 = $s_xml.SelectSingleNode('/Configuration/SMSServerConf')
$parent = $n1.ParentNode

# remove existing node
$parent.RemoveChild($n1) | Out-Null

# add node from source XML
$parent.AppendChild($d_xml.ImportNode($n2, $true)) | Out-Null