Public/ConvertTo-WellFormedXml.ps1

Function ConvertTo-WellFormedXml {
    <#
        .Synopsis
            Convert a fragment of well-formed HTML into a well-formed XML document.
        .Description
            Wraps the input in an XML envelope with HTML entity declarations,
            then parses it into an XDocument.
        .Example
            '<p>Hello</p>' | ConvertTo-WellFormedXml
    #>

    [CmdletBinding()]
    [OutputType([System.Xml.Linq.XDocument])]
    param (
        [Parameter(Position = 0, ValueFromPipeline = $true)]
        [string]$InputConflunceHtmlString = [String]::Empty
    )
    Begin {
        [System.Xml.Linq.XDocument]$OutputXml = [System.Xml.Linq.XDocument]::Empty
    }
    Process {
        $HtmlEntities = 'nbsp','rarr','larr','uarr','darr','nwarr','nearr','swarr','searr','spades','clubs','hearts','diams','hellip','lsquo','rsquo','sbquo','ldquo','rdquo','bdquo','lsaquo','rsaquo','laquo','raquo','copy','trade','quot','ndash','mbash','aacute','agrave','acirc','auml','aring','atilde','eacute','egrave','ecirc','euml','iacute','igrave','icirc','iuml','ntilde','oacute','ograve','ocirc','ouml','otilde','uacute','ugrave','ucirc','uuml','szlig','aelig','ccedil','brvbar','Ntilde','acute'
        $HtmlEntityList = '<!ENTITY {0} "">' -f ($HtmlEntities -join ' ""><!ENTITY ')
        $InputXml = ('<!DOCTYPE xml [ {0} ]><xml xmlns:metanull="https://bitbucket.org/metanull">{1}</xml>' -f $HtmlEntityList, $InputConflunceHtmlString)
        $OutputXml = [System.Xml.Linq.XDocument]::Parse($InputXml)
    }
    End {
        return $OutputXml
    }
}