Найдите ключ и замените его соответствующее значение в файлах config / xml, используя powershell - PullRequest
0 голосов
/ 20 ноября 2018

У меня есть файл конфигурации, подобный приведенному ниже:

<?xml version="1.0" encoding="utf-8"?>
<configuration>  
  <startup>
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.6.1" />
  </startup>
  <runtime>
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
      <dependentAssembly>
        <assemblyIdentity name="System.Net.Http" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
        <bindingRedirect oldVersion="0.0.0.0-4.1.1.3" newVersion="4.1.1.3" />
      </dependentAssembly>
      <dependentAssembly>
        <assemblyIdentity name="Newtonsoft.Json" publicKeyToken="30ad4fe6b2a6aeed" culture="neutral" />
        <bindingRedirect oldVersion="0.0.0.0-11.0.0.0" newVersion="11.0.0.0" />
      </dependentAssembly>      
    </assemblyBinding>
  </runtime>
  <appSettings>
    <add key="key1" value="Value1" />
    <add key="key2" value="Value12" />
    <add key="key3" value="Value3" />   
  </appSettings>
</configuration>

Теперь через powershell я пытаюсь заменить некоторые значения, например, Value1. Для этого я написал следующий скрипт:

$original_file = "C:\test.xml"
(Get-Content $original_file) | Foreach-Object {
     $_ -replace 'Value1', 'Newvalue'
    } | Set-Content $original_file

Итак, что он делает, он заменяет все строки Value1 на строку Newvalue. Проблема, с которой я здесь сталкиваюсь, заключается в изменении всех значений, где Value1 найдено, вот так.

  <appSettings>
    <add key="key1" value="Newvalue" />
    <add key="key2" value="Newvalue2" /> --- this is not supposed to happen
    <add key="key3" value="Value3" />  
</appSettings>

И на самом деле, у меня фактические значения очень длинные строки.

Так есть ли способ найти ключ и изменить его значение? Как найти Key1 и изменить его значение на NewValue.

Любая помощь высоко ценится.

1 Ответ

0 голосов
/ 20 ноября 2018

Не использовать регулярное выражение для структурированной разметки - использовать XPath!

# Load the xml document
$filename = 'C:\test.xml'
$xmlDoc = New-Object xml
$xmlDoc.Load($filename)

# Select all applicable nodes
$nodes = $xmlDoc.SelectNodes('//appSettings/add[@key="key1"]')

# In each node, replace the value `Value1` with `NewValue`
foreach($node in $nodes){
  $node.value = $node.value.Replace('Value1','NewValue')
}

# Save the document
$xmlDoc.Save($filename)

Выражение XPath //appSettings/add[@key="key1"] выберет любой узел add, имеющий атрибут с именем key со значением key1 и родительским узлом которого является appSettings узел.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...