Formatting/System.Xml.XmlElement.format.ps1

$showElementIf = {'#text','#whitespace' -notcontains $_.LocalName }
Write-FormatTreeView -Property @({
    Write-FormatViewExpression -ForegroundColor 'EZOut.Xml.Tag' -if $showElementIf -ScriptBlock { '<'.Trim() } 
    Write-FormatViewExpression -ForegroundColor 'EZOut.Xml.Element' -if $showElementIf -ScriptBlock {
        $_.LocalName + $(if ($_.HasAttributes) { ' ' })      
    }
    Write-FormatViewExpression -ControlName XmlAttributeControl -ScriptBlock {$_.Attributes} -Enumerate -If { 
        $_.HasAttributes -and '#text', '#whitespace' -notcontains $_.LocalName
    } 
    Write-FormatViewExpression -ForegroundColor 'EZOut.Xml.Tag' -ScriptBlock {        
        if ($_.HasChildren -or $_.HasChildNodes) {
            '>'
        } else {
            '/>'
        }
    } -if $showElementIf
    Write-FormatViewExpression -If { $_.LocalName -eq '#text' } -ScriptBlock {$_.InnerText } -ForegroundColor 'EZOut.Xml.InnerText' 
}) -TypeName System.Xml.XmlElement -HasChildren { $_.HasChildren -or $_.HasChildNodes -and $_.LocalName -ne '#whitespace'} -Children {
    @(foreach ($cn in $_.ChildNodes) {
        if ($cn.LocalName -eq '#whitespace') { continue }
        $cn
    })
} -EndBranchScript {
    Write-FormatViewExpression -ForegroundColor 'EZOut.Xml.Tag' -ScriptBlock {
        if (-not ($_.HasChildren -or $_.HasChildNodes)) {
            ''
        } else {
            [Environment]::NewLine + (' ' * ($script:TreeDepth - 1)* 4) + '</'
        }
    }
    Write-FormatViewExpression -ForegroundColor 'EZOut.Xml.Element' -ScriptBlock {
         if ($_.HasChildren -or $_.HasChildNodes) { $_.LocalName}
    }
    Write-FormatViewExpression -ForegroundColor 'EZOut.Xml.Tag' -ScriptBlock {
         if ($_.HasChildren -or $_.HasChildNodes) {'>'}
    } 
} -ControlName XmlNodeControl