0

Suppose I have the following XML file, and I want to use PowerShell (version 1.0) to manipulate the XML file to get the value for Foo (in this sample, value I want to get is "Foo Value") and Goo (in this sample, value I want to get is "Goo Value"), any ideas how to implement?

$FooConfig = [xml](get-content .\Foo.exe.config -ErrorAction:stop)

<configuration>
 <appSettings>
    <add key="Foo" value="Foo Value" />
    <add key="Goo" value="Goo Value" />
 </appSettings>
</configuration>

thanks in advance, George

George2
  • 44,761
  • 110
  • 317
  • 455

2 Answers2

4

The XPath API is very alive under PowerShell (your XML is, after all, just .NET objects), and it can often be the easiest to use if you just want a value:

$appSettingsSection = $fooConfig.configuration.appSettings;
$goo = $appSettingsSection.SelectSingleNode("add[@key='Goo']");
$goo.Value

Or if you want to enumerate the add elements as a PowerShell collection (a bit more PowerShell'ish :-)

$appSettingsSection = $fooConfig.configuration.appSettings.add

Will print

key                                                         value
---                                                         -----
Foo                                                         Foo Value
Goo                                                         Goo Value

And of course, you can pipe that result to additional commands to do whatever processing you like.

driis
  • 161,458
  • 45
  • 265
  • 341
2

Yet annother approach using XPATH with the XML API is to use SelectNodes:

PS> $FooConfig .SelectNodes('//add')

key                                                         value
---                                                         -----
Foo                                                         Foo Value
Goo                                                         Goo Value
  • 2
    Careful there! This is a config file and most config files have many 'add' nodes. So this would grab the 'add' nodes in appSettings as well as connectionStrings and god only knows what else. – Mark Arnott Jan 12 '10 at 20:22