Parse xml in powershell Parse xml in powershell xml xml

Parse xml in powershell


This version uses a bit more PowerShell and handles the case of mulitple items with WorkDir keys:

$xml = [xml](Get-Content foo.xml)$xpath = "/sections/section/item[@key='WorkDir']" Microsoft.PowerShell.Utility\Select-Xml $xml -XPath $xpath |    Foreach {$_.Node.SetAttribute('value', $pwd)}$xml.Save("$pwd\bar.xml")

Note, if you have the PowerShell Community Extensions installed you can use the Format-Xml cmdlet to format the output and save it via Out-File e.g.:

$xml | Format-Xml -AttributesOnNewLine | Out-File bar.xml -enc utf8

OTOH $xml.Save() is easier except that you must remember that it probably doesn't have the correct current dir if you were to specify just the filename. That's why I used "$pwd\bar.xml" in the first example. This is not an issue with PowerShell cmdlets like Out-File.


You could try this

$xmlFile = "d:\sample.xml"[xml]$doc = Get-Content $xmlFile$node = $doc.SelectSingleNode("/sections/section/item[@key='WorkDir']")$node.Value = "New-Value"$doc.Save($xmlFile)

You'll still be using some .Net classes and an XPath query to select the node.


You can load your XML into a LINQ XDocument class from PowerShell like this:

[Reflection.Assembly]::LoadWithpartialName("System.Xml.Linq") | Out-Null$xDoc = [System.Xml.Linq.XDocument]::Parse($myXmlString)

From there you can use the usual LINQ to XML methods to replace the attribute as in this example. If you prefer you could use the older XmlDocument class in a similar way.