Convert XML to PSObject Convert XML to PSObject xml xml

Convert XML to PSObject


You can do this pretty easily with XPath. Although PowerShell usually makes working with XML pretty simple, in this case I think the format using strictly PowerShell syntax would be pretty gross.

filter XmlProperty([String]$Property) {    $_.SelectSingleNode("/Objects/Object/Property[@Name='$Property']").InnerText}$Name = $b | Xmlproperty Name$Server = $b | XmlProperty Server# etc...

EDIT: To generically do this for an XML document that contains one or more Object elements, you can do something like this:

function ConvertFrom-Xml($XML) {    foreach ($Object in @($XML.Objects.Object)) {        $PSObject = New-Object PSObject        foreach ($Property in @($Object.Property)) {            $PSObject | Add-Member NoteProperty $Property.Name $Property.InnerText        }        $PSObject    }}ConvertFrom-Xml $b


My variant with unlimited depth.

See examples.

function ConvertFrom-Xml {<#.SYNOPSIS    Converts XML object to PSObject representation for further ConvertTo-Json transformation.EXAMPLE    # JSON->XML    $xml = ConvertTo-Xml (get-content 1.json | ConvertFrom-Json) -Depth 4 -NoTypeInformation -as String.EXAMPLE    # XML->JSON    ConvertFrom-Xml ([xml]($xml)).Objects.Object | ConvertTo-Json#>    param([System.Xml.XmlElement]$Object)    if (($Object -ne $null) -and ($Object.Property -ne $null)) {        $PSObject = New-Object PSObject        foreach ($Property in @($Object.Property)) {            if ($Property.Property.Name -like 'Property') {                $PSObject | Add-Member NoteProperty $Property.Name ($Property.Property | % {ConvertFrom-Xml $_})            } else {                if ($Property.'#text' -ne $null) {                    $PSObject | Add-Member NoteProperty $Property.Name $Property.'#text'                } else {                    if ($Property.Name -ne $null) {                        $PSObject | Add-Member NoteProperty $Property.Name (ConvertFrom-Xml $Property)                    }                }            }         }           $PSObject    }}


I usually parse xml to hash tables but using the convertto function I grabbed from here I adapted the function to convert to pscustom objects

function xmlNodeToPsCustomObject ($node){    $hash = @{}    foreach($attribute in $node.attributes){        $hash.$($attribute.name) = $attribute.Value    }    $childNodesList = ($node.childnodes | ?{$_ -ne $null}).LocalName    foreach($childnode in ($node.childnodes | ?{$_ -ne $null})){        if(($childNodesList | ?{$_ -eq $childnode.LocalName}).count -gt 1){            if(!($hash.$($childnode.LocalName))){                $hash.$($childnode.LocalName) += @()            }            if ($childnode.'#text' -ne $null) {                $hash.$($childnode.LocalName) += $childnode.'#text'            }            $hash.$($childnode.LocalName) += xmlNodeToPsCustomObject($childnode)        }else{            if ($childnode.'#text' -ne $null) {                $hash.$($childnode.LocalName) = $childnode.'#text'            }else{                $hash.$($childnode.LocalName) = xmlNodeToPsCustomObject($childnode)            }        }       }    return $hash | ConvertTo-PsCustomObjectFromHashtable}function ConvertTo-PsCustomObjectFromHashtable {     param (         [Parameter(              Position = 0,               Mandatory = $true,               ValueFromPipeline = $true,              ValueFromPipelineByPropertyName = $true          )] [object[]]$hashtable     );     begin { $i = 0; }     process {         foreach ($myHashtable in $hashtable) {             if ($myHashtable.GetType().Name -eq 'hashtable') {                 $output = New-Object -TypeName PsObject;                 Add-Member -InputObject $output -MemberType ScriptMethod -Name AddNote -Value {                      Add-Member -InputObject $this -MemberType NoteProperty -Name $args[0] -Value $args[1];                 };                 $myHashtable.Keys | Sort-Object | % {                      $output.AddNote($_, $myHashtable.$_);                  }                 $output            } else {                 Write-Warning "Index $i is not of type [hashtable]";             }            $i += 1;          }    } }