我需要将XHTML5文件解析为
对于XHTML 1.0,可以使用
然而,XHTML5没有DTD,如在另一个答案中讨论的那样。它的实体定义仅供信息参考,以JSON格式提供。
因此,在解析XHTML5实体时,
目前,我正在研究两种方法。第一种是在文档类型声明中指定包含实体声明的内部子集,可以通过对源XHTML进行字符串操作或者使用
似乎在XHTML5中允许这样做;但是,这是不可取的,因为它会在
我的另一种方法是使用正则表达式预处理XHTML字符串,将所有命名字符引用转换为数字字符引用(或实际Unicode字符),但排除XML预定义实体
是否有任何经验或建议关于这两种方法,或者您考虑的其他方法?我更喜欢基于
XDocument
实例。我的文件将始终是格式良好的XML,因此我想避免使用HtmlAgilityPack,因为它对格式不正确的XHTML过于宽容。 XDocument.Load
方法适用于简单情况,但在文档中包含命名字符引用(实体)时会出现错误:var xhtml = XDocument.Load(reader);
// XmlException: Reference to undeclared entity 'nbsp'.
对于XHTML 1.0,可以使用
XmlPreloadedResolver
来解决这个问题,该方法预加载了在XHTML 1.0中定义的众所周知的DTD。可以通过手动提供其DTD的方式扩展此方法以支持XHTML 1.1,如此答案所示。然而,XHTML5没有DTD,如在另一个答案中讨论的那样。它的实体定义仅供信息参考,以JSON格式提供。
<!DOCTYPE html>
因此,在解析XHTML5实体时,
XmlResolver
方法不会被调用。有关尝试为提供XmlReader
实体声明列表的讨论,但似乎没有一种方法可以直接奏效。目前,我正在研究两种方法。第一种是在文档类型声明中指定包含实体声明的内部子集,可以通过对源XHTML进行字符串操作或者使用
XmlParserContext.InternalSubset
来实现。这将导致类似于以下的文档类型声明:<!DOCTYPE html [
<!ENTITY ndash "–">
<!ENTITY nbsp " ">
...
]>
似乎在XHTML5中允许这样做;但是,这是不可取的,因为它会在
XDocument
中留下实体声明(现在有2000多个),如果用户将其转换回字符串表示形式,则可能会出现问题。我的另一种方法是使用正则表达式预处理XHTML字符串,将所有命名字符引用转换为数字字符引用(或实际Unicode字符),但排除XML预定义实体
" & ' < >
。然而,我担心在XML的定义中存在复杂性,这种方法可能会错过。例如,这个答案表明,字符不能在注释、CDATA部分或处理指令中转义。我认为我的正则表达式需要进行调整,以排除所有这些情况。是否有任何经验或建议关于这两种方法,或者您考虑的其他方法?我更喜欢基于
XmlReader
的可扩展性的方法,但如果没有其他方法,我将采用源字符串操作。