.NET xElement错误协调(html实体名称到其数字字符引用的转换)

.NET xElement错误协调(html实体名称到其数字字符引用的转换),html,.net,xml,Html,.net,Xml,我需要将HTML解析为xElement。我知道这个解决方案不能很好地原谅格式错误的HTML。这是好的,因为我想陷阱到无效的HTML无论如何。但是,我不希望每次遇到HTML实体时XElement.Parse()方法都失败 我想知道在.NET框架中是否有内置的东西可以将命名的HTML实体转换为数字字符引用 这是可行的,但我真的不想对每个实体都这样做 Public Function GetEntityReplacementList() As IDictionary(Of String, String)

我需要将HTML解析为xElement。我知道这个解决方案不能很好地原谅格式错误的HTML。这是好的,因为我想陷阱到无效的HTML无论如何。但是,我不希望每次遇到HTML实体时XElement.Parse()方法都失败

我想知道在.NET框架中是否有内置的东西可以将命名的HTML实体转换为数字字符引用

这是可行的,但我真的不想对每个实体都这样做

Public Function GetEntityReplacementList() As IDictionary(Of String, String)
    'http://www.w3.org/TR/html4/sgml/entities.html
    Dim _dictonary As New Dictionary(Of String, String)
    _dictonary.Add(" ", " ") ' " " non-breaking space
    _dictonary.Add("&lt;", "&#60;") '<  less than
    _dictonary.Add("&gt;", "&#62;") '>  greater than
    _dictonary.Add("&amp;", "&#38;") '&     ampersand
    _dictonary.Add("&cent;", "&#162;") '¢   cent
    _dictonary.Add("&pound;", "&#163;") '£  pound
    _dictonary.Add("&yen;", "&#165;") '¥    yen
    _dictonary.Add("&euro;", "&#8364;") '€  euro
    _dictonary.Add("&copy;", "&#169;") '©   copyright
    _dictonary.Add("&reg;", "&#174;") '® registered trademark
    _dictonary.Add("&lsquo;", "&#8216;") ' single quote
    _dictonary.Add("&rsquo;", "&#8217;") ' single quote
    _dictonary.Add("&ldquo;", "&#8220;") ' Double quote
    _dictonary.Add("&rdquo;", "&#8221;") ' Double quote
    _dictonary.Add("&bull;", "&#8226;") ' Bullet
    _dictonary.Add("&ccedil;", "&#199;")
    _dictonary.Add("&euml;", "&#199;")
    _dictonary.Add("&eacute;", "&#233;")
    _dictonary.Add("&mdash;", "&#8212;")
    _dictonary.Add("&egrave;", "&#200;")
    _dictonary.Add("&aacute;", "&#225;")
    _dictonary.Add("&ndash;", "&#8211;")
    Return _dictonary
End Function

<Extension()>
Public Function CreateXElementWithEntityReplacements(p_xml As String) As XElement


    For Each _pair In GetEntityReplacementList()
        p_xml = Regex.Replace(p_xml, _pair.Key, _pair.Value, RegexOptions.IgnoreCase)
    Next

    Return XElement.Parse(p_xml)

End Function
公共函数GetEntityReplacementList()作为IDictionary(字符串的,字符串的)
'http://www.w3.org/TR/html4/sgml/entities.html
Dim_Dictionary作为新词典(字符串、字符串)
_添加(“,”和“#160;”“,”不间断空格
_口述。加上(“,”和#60;”)<小于
_口述。加上(“,”和“#62;”)大于
_口述。加上(“&;”、“&38;”)和符号
_口述。加上(“¢;”、“¢;”)、分
_口述。加上(“£;”、“£;”)英镑
_口述。加上(“¥;”,“&165;”)日元
_命令式。添加(“&euro;”,“€;”)欧元
_口述。添加(“©;”、“©;”)©版权所有
_添加(“®;”、“®;”)注册商标
_命令式。添加(“&lsquo;”、“‘;”)单引号
_口述。添加(“&rsquo;”、“’;”)单引号
_口述。加上(“&ldquo;”、“&8220;”)双引号
_命令式。添加(“&rdquo;”、“”;”)双引号
_命令式。添加(“&bull;”、“•;”)项目符号
_添加(“ç;”,“Ç;”)
_添加(“ë;”、“Ç;”)
_添加(“é;”,“&233;”)
_添加(“&mdash;”、“&8212;”)
_添加(“è;”,“&200;”)
_添加(“á;”,“&225;”)
_添加(“&ndash;”、“&8211;”)
返回命令
端函数
公共函数createXelementTwithenTityReplacements(p_xml作为字符串)作为XElement
对于GetEntityReplacementList()中的每个_对
p_xml=Regex.Replace(p_xml、_pair.Key、_pair.Value、RegexOptions.IgnoreCase)
下一个
返回XElement.Parse(p_xml)
端函数

您在这里会遇到很多问题。尽管您希望捕获无效的HTML,但也有一些有效的HTML是无效的XML—例如,

是有效的HTML,但却是无效的XML

但是,如果您确信您的解决方案只需要解析也是有效XML的HTML,那么只需将正确的实体定义添加到文档字符串的顶部,它就会从那里正确解析。例如,可以将以下内容添加到html字符串中:

<!DOCTYPE documentElement[
  <!ENTITY nbsp "&#16;">
]><a href = 'blah'>&nbsp; &lt; &amp;</a>

这将解析为有效的HTML。您可以从HTML DTD中获得实体列表,可在以下位置获得:


您可以跳过
lt
gt
amp
——这些都是有效的XML实体。或者,您可以将该列表重构到您的字典中。

您考虑过使用HtmlAgilitypack吗?我考虑过,我现在正试图避免使用第三方库。有人吗??我没有在MSDN中找到任何东西。感谢您的反馈。你完全正确。我正在写一个Epub阅读器,所以我还必须解释格式错误的html。我认为xElement类不再是一种发展方向。我知道你说过你想避免第三方LIB,但这正是HtmlAgilityPack编写的目的。