c# – 将XHTML5解析为XDocument

c# – 将XHTML5解析为XDocument,第1张

概述我需要将X HTML5文件解析为XDocument实例.我的文件将始终是格式良好的XML,因此我希望避免 HtmlAgilityPack由于其格式错误的XHTML的允许性. XDocument.Load方法适用于简单情况,但在文档包含命名字符引用(实体)时中断: var xhtml = XDocument.Load(reader);// XmlException: Reference to un 我需要将X HTML5文件解析为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,如this answer所示.

但是,XHTML5没有DTD,如this other answer所述.其实体定义仅供参考as JSON.

<!DOCTYPE HTML>

因此,在XHTML5中解析实体时,永远不会调用XmlResolver方法.有人讨论了providing XmlReader with a list of entity declarations的尝试,但没有任何方法似乎开箱即用.

目前,我正在研究两种方法.第一种是通过源xhtml上的字符串 *** 作或通过XmlParserContext.InternalSubset在文档类型声明中指定具有实体声明的内部子集.这将导致文档类型声明类似于:

<!DOCTYPE HTML [  <!ENTITY ndash "&#8211;">  <!ENTITY nbsp "&#160;">  ...]>

在XHTML5中似乎是这个is allowed;但是,它是不受欢迎的,因为它使用实体声明(现在有more than 2000)来填充Xdocument,如果用户将其转换回字符串表示,这将是有问题的.

我的另一种方法是使用正则表达式预处理xhtml字符串,将所有命名字符引用转换为数字字符引用(或实际的Unicode字符),不包括XML预定义实体,“&’<>.但是,我我担心这种方法可能会错过XML的定义中的复杂性.例如,this answer表示不能在注释,cdaTA部分或处理指令中转义字符.我假设我的正则表达式需要调整以排除所有这些事件.

有没有人对这两种方法或您考虑的任何其他方法有经验或建议?我更喜欢基于XmlReader的可扩展性的方法,但如果没有其他方法,将采用源字符串 *** 作.

解决方法 如果您将身份转换应用于具有实体映射的源文档,它将在结果中替换您的实际字符.对我来说,这与正则表达式没有什么不同(一步),当然也不那么复杂.

鉴于此来源:

<!DOCTYPE foo [ <!ENTITY ndash "&#8211;"> <!ENTITY nbsp "&#160;">]><foo>  <p>I am &ndash; and I am&nbsp;non-breaking space.</p></foo>

而这个转变:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/transform"        version="1.0">        <xsl:template match="@*|node()">            <xsl:copy>                <xsl:apply-templates select="@*|node()"/>            </xsl:copy>        </xsl:template>    </xsl:stylesheet>

您将此结果作为新输入:

<foo>   <p>I am – and I am non-breaking space.</p></foo>

此外,您可以将所有这些定义保存在单独的文件中,并像这样添加一个引用:

<!ENTITY % winansi SYstem "path/to/my/map/winansi.xml">  %winansi;]>
总结

以上是内存溢出为你收集整理的c# – 将XHTML5解析为XDocument全部内容,希望文章能够帮你解决c# – 将XHTML5解析为XDocument所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1232005.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-06
下一篇 2022-06-06

发表评论

登录后才能评论

评论列表(0条)

保存