Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Parse xml in powershell

Tags:

powershell

xml

I have the following xml:

<?xml version="1.0" encoding="UTF-8"?>
<sections>
  <section name="Options">
    <item key="HLVersionControlWebServiceURL" value="http://www.personec.no/webservices/HLVersionControl/HLVersionControl.asmx" />
    <item key="AltinnWebServiceURL" value="https://www.altinn.no/webservices/DataExchange.asmx" />
    <item key="WorkDir" value="F:\Altinn\Work\" />
    <item key="CatalogDir" value="F:\Altinn\Work\" />
  </section>
  <section name="Users">
    <item key="1" value="Admin" name="Administrator" fNr="" password="" entsystype="1" entsysid="180967" entsyspassword="" lastLogin="20091111161516" allowra0500="1" allowrf1037="1" allowra01821="1" allowra01822="0" allowrf1015="1" altinnuserpassword="/qwHHYwYinE=" />
  </section>
  <section name="SchemaTypes">
    <item key="RF1037" displayname="Terminoppgave" inputdir="F:\Altinn\Work\" validationschema=".\melding-669-8570.xsd" isSubForm="0" isSignable="0" />
    <item key="RA0500" displayname="SSB Lønnsstatistikk" inputdir="C:\Program Files (x86)\Personec\Altinn Monitor\Work\" validationschema=".\melding-868-7612.xsd" isSubForm="0" isSignable="0" />
    <item key="RA01821" displayname="SSB Fraværsstatistikk bedrift" inputdir="C:\Program Files (x86)\Personec\Altinn Monitor\Work\" validationschema=".\melding-862-6190.xsd" isSubForm="0" isSignable="0" />
    <item key="RF1015" displayname="Årsoppgave m/ LTO" inputdir="C:\Program Files (x86)\Personec\Altinn Monitor\Work\" validationschema=".\melding-210-7928.xsd" orid="210" orversion="7928" isSubForm="0" isSignable="1" />
    <item key="RF1015U" displayname="" inputdir="" validationschema=".\melding-1083-7930.xsd" orid="1083" orversion="7930" isSubForm="1" isSignable="1" />
  </section>
</sections>

And I need to alter the item key WorkDir in Powershell. When using "regular" xml-read I get to the top sections (options, users, and so on) but not the "item key" nodes within each. How can I edit the value for WorkDir in powershell? (I realize I could just use a dirty string replace but I'd rather do it "properly".

like image 678
Trondh Avatar asked Nov 12 '09 08:11

Trondh


People also ask

Can PowerShell parse XML?

Another way to use PowerShell to parse XML is to convert that XML to objects. The easiest way to do this is with the [xml] type accelerator. By prefixing the variable names with [xml] , PowerShell converts the original plain text XML into objects you can then work with.

Which PowerShell command does support XML?

The Select-Xml cmdlet lets you use XPath queries to search for text in XML strings and documents. Enter an XPath query, and use the Content, Path, or Xml parameter to specify the XML to be searched.


1 Answers

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.

like image 173
Keith Hill Avatar answered Oct 14 '22 00:10

Keith Hill