Private/ConvertFrom-CliXml.ps1
<#
.SYNOPSIS Imports a CliXml string with data that represents Microsoft .NET objects and creates the objects within PowerShell. .DESCRIPTION The ConvertFrom-CliXml command imports a CliXml string with data that represents Microsoft .NET Framework objects and creates the objects in PowerShell. .PARAMETER InputObject String containing the Xml with serialized objects. .INPUTS System.String .OUTPUTS object .NOTES Help Author: Adam Najmanowicz, Michael West .LINK https://github.com/SitecorePowerShell/Console/ .LINK ConvertTo-CliXml .LINK ConvertTo-Xml .LINK ConvertFrom-Xml .LINK Export-CliXml .LINK Import-CliXml .LINK https://github.com/SitecorePowerShell/Console/issues/218 .EXAMPLE PS master:\> #Convert original item to xml PS master:\> $myCliXmlItem = Get-Item -Path master:\content\home | ConvertTo-CliXml PS master:\> #print the CliXml PS master:\> $myCliXmlItem PS master:\> #print the Item converted back from CliXml PS master:\> $myCliXmlItem | ConvertFrom-CliXml #> function ConvertFrom-CliXml { param( [Parameter(Position=0, Mandatory=$true, ValueFromPipeline=$true)] [ValidateNotNullOrEmpty()] [String[]]$InputObject ) begin { $OFS = "`n" [String]$xmlString = "" } process { $xmlString += $InputObject } end { $type = [PSObject].Assembly.GetType('System.Management.Automation.Deserializer') $ctor = $type.GetConstructor('instance,nonpublic', $null, @([xml.xmlreader]), $null) $sr = New-Object System.IO.StringReader $xmlString $xr = New-Object System.Xml.XmlTextReader $sr $deserializer = $ctor.Invoke($xr) $done = $type.GetMethod('Done', [System.Reflection.BindingFlags]'nonpublic,instance') while (!$type.InvokeMember("Done", "InvokeMethod,NonPublic,Instance", $null, $deserializer, @())) { try { $type.InvokeMember("Deserialize", "InvokeMethod,NonPublic,Instance", $null, $deserializer, @()) } catch { Write-Warning "Could not deserialize ${string}: $_" } } $xr.Close() $sr.Dispose() } } |