internal/Get-ReportXMLResult.ps1
function Get-ReportXMLResult { Param ( $outputFormat, $resultXML ) $result = $resultXML.REPORTRESULT.RESULT.InnerText switch ($outputFormat) { 'CSV' { # Synergy sometimes returns CSV files with duplicate headers $lineone = ($result -split '\n')[0] | ForEach-Object {$_ -replace '"', ''} [array]$Headers = $lineone -split "," For ($i = 0; $i -lt $Headers.Count; $i++) { if ($i -eq 0) { Continue } #Skip first column. # If in any previous column, give it a generic header name if ($Headers[0..($i - 1)] -contains $Headers[$i]) { $Headers[$i] = "Header$i" } } $fixed = $result | ConvertFrom-Csv -Header $Headers # $data = $fixed | Select-Object -Skip 1 $data = $fixed | Select-Object -Skip 1 | Where-Object {$_.PSObject.Properties.Value -ne ''} } {$_ -in 'HTML', 'RTF'} {$data = $result } {$_ -in 'PDF', 'TIFF', 'EXCEL', 'TXT'} { $enc0 = [System.Text.Encoding]::ASCII $encU = [System.Text.Encoding]::Unicode $b = [System.Convert]::FromBase64String($result) $f = $enc0.GetString( [System.Text.Encoding]::Convert($encU, $enc0, $b)) $data = $f.Substring(1) } 'XML' { $enc0 = [System.Text.Encoding]::ASCII $encU = [System.Text.Encoding]::Unicode $b = [System.Convert]::FromBase64String($result) $f = $enc0.GetString( [System.Text.Encoding]::Convert($encU, $enc0, $b)) [xml]$x = $f.Substring(1) # $rdr = $x.REV_REPORT.REV_DATA_ROOT.ChildNodes.Where({$_.name -notlike "REV*"}) # $labels = $x.REV_REPORT.REV_DATA_DEF # $data = $rdr | ConvertTo-Csv | ConvertFrom-Csv $data = ConvertFrom-SynergyXml -xml $x } Default { $data = $result } } #Write-Progress -Activity "Running Synergy Report..." -Completed -Status "All done." -PercentComplete 100 return $data } function ConvertFrom-SynergyXml { param ( [xml]$xml ) $nodes = $xml | Select-Xml "//REV_LABEL_GROUP/*" For ($i = 0; $i -lt $nodes.Count; $i++) { if ($i -eq 0) { Continue } #Skip first column. # If in any previous column, give it a generic header name if ($nodes[0..($i - 1)].Node.Label -contains $nodes[$i].Node.Label) { $nodes[$i].Node.Label = $nodes[$i].Node.LocalName } } $headers = foreach ($node in $nodes) { [PSCustomObject]@{ LocalName = $node.Node.LocalName Label = $node.Node.Label Order = [int]$node.Node.ORDER } } $dataNodes = $xml | Select-Xml "//REV_DATA_ROOT/*[not(self::REV_TIME)][not(self::REV_DATE)]" $a = [System.Collections.ArrayList]@() foreach ($i in $dataNodes) { $dat = $i.Node $x = [PSCustomObject]@{} foreach ($h in $headers){ $x | Add-Member -MemberType NoteProperty -Name $h.Label -Value $dat.($h.LocalName) } $null = $a.Add($x) } return $a } |