【问题标题】:Powershell update xml key value based on other key valuePowershell根据其他键值更新xml键值
【发布时间】:2014-08-08 14:39:22
【问题描述】:

我正在尝试编写一些 powershell,它将根据同一节点中另一个键值对的值更新 xml 键值对的值。示例 xml:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
 <plugins>
  <plugin pluginType="plugin1" polling_internal="2" polling_unit="M" enabled="true">
      <params>
        <add key="Server" value="server1.local" />
        <add key="database" value="databasename1" />
      </params>
    </plugin>
  <plugin pluginType="plugin2" polling_internal="2" polling_unit="M" enabled="true">
      <params>
        <add key="Server" value="server2.local" />
        <add key="database" value="databasename2" />
      </params>
    </plugin>
 </plugins>
</configuration>

真实文件中有数百个插件。我想找到名为 databasename1 - &lt;add key="database" value="databasename1" 的所有数据库实例,并使用服务器名称 server2.local 更新相应的服务器键。

我知道这可以通过 select-xml 和 xpath 完成,但它超出了我的范围。非常感谢任何帮助。

【问题讨论】:

标签: xml powershell xpath


【解决方案1】:

您可以使用此 XPath 根据您解释的标准获取所有 value 属性(为便于阅读而格式化 xpath):

//plugin
    /params[add[@key='database' and @value='databasename1']]
        /add[@key='Server']
            /@value

最复杂的部分(上面 xpath 中的第 2 行)是指使用条件搜索 &lt;params&gt; 节点:有子节点 &lt;add&gt; 具有属性 key 值等于“database”并且属性 value 值等于“databasename1”。其余的与其他答案中展示的类似:

[XML]$xml = #load XML file
$xpath = "/configuration/plugins/plugin/params[add[@value='databasename1' and @key ='database']]/add[@key='Server']/@value"
$nodes = $xml.SelectNodes($xpath)

foreach ($n in $nodes) {
    $n.value = "server2.local"
}
#save XML back to file

【讨论】:

    【解决方案2】:

    这样的事情应该可以解决问题:

    [Xml]$oXml = Get-Content oldfile.xml
    
    $sXPath = "/configuration/plugins/plugin/params/add[@value='databasename1']"
    $cChildren = $oXml.SelectNodes($sXPath)
    
    foreach ($oChild in $cChildren) {
        $oParent = $oChild.get_ParentNode()
        $oServer = $oParent.ChildNodes | Where-Object { $_.key -eq "Server" }
        $oServer.value = "server2.local"
    }
    
    $oXml.OuterXml | Out-File newfile.xml
    

    如果您使用更复杂的 XPath,应该可以使用更少的代码。

    【讨论】:

      猜你喜欢
      • 2022-12-01
      • 1970-01-01
      • 2020-12-22
      • 1970-01-01
      • 2020-03-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-19
      相关资源
      最近更新 更多