如何使XmlDocument尊重HTML转义序列

问题描述

| 免责声明:是的,我知道解决方案不是最佳解决方案,但事实并非如此。 我们正在创建一个大型XML文件,然后通过WCF服务对其进行服务。消费者是具有移动网关的供应商。他们拿起大文件,将其切碎以进行移动通话。 实际的创建位使用Microsoft XML对象(XmlDocument,XmlElement,XmlTextNode等),然后保存到文件系统。该服务提取文件并将其重构为XML文档并提供服务。
[OperationContract]
[Description(\"Gets all products for SnP and Systems.\")]
[WebGet(UriTemplate = \"shop/products/all?appId={appId}\")]
XmlElement GetAllProductsAsXmlDocument(string appId);
生成文件时,最终得到的文件看起来像这样:
<content>&lt;b&gt;Intel® Core™ Duo &amp; 2 GB RAM&lt;/b&gt;</content>
在浏览器中为HTML时,其外观类似于Intel®Core™Duo和2 GB RAM 。 供应商已要求在XML文档中添加文本,如下所示:
<content>&lt;b&gt;Intel&reg; Core&Trade; Duo &amp; 2 GB RAM&lt;/b&gt;</content>
如果这是一个字符串,而不是XML节点中的文本,那么我可以轻松地做到这一点:
string hackedString = HttpUtility.HtmlEncode(nonHackedTextFromXmlNode);
但是编码,然后将其作为TextNode打入XmlDocument会产生:
<content>&lt;b&gt;Intel® Core™ Duo &amp; 2 GB RAM&lt;/b&gt;</content>
因此,Microsoft Xml可以识别某些转义的HTML序列,并将其转换为XML规范中找到的版本。通过手动编码,我也可以以&amp; amp;结尾。和&#174; (一个乱七八糟的®,如174个十进制==®),但是如果识别出该符号已进入XML文档,则在装入转义版本时,其外观如上。 问题是,是否存在可以与.NET XmlDocument一起使用的某些独特类型的编码或设置或\“ other \”,以生成自动尊重HTML编码规则的节点? 如果无法完成,那很好。我已经提出了两种可能性: 创建CDATA节点而不是标准文本节点,因此不会更改编码 保存文件后转换字符,并在WCF服务中将其作为字符串(而不是XmlDocument)使用。 让供应商将数据转换为HTML转义的字符串 有什么想法吗? 附加信息: 根据建议,添加了HTML DTD:
string dtdLink = \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\"; 
string dtdDef = \"-//W3C//DTD XHTML 1.0 Transitional//EN\"
XmlDocumentType docType = htmlDoc.CreateDocumentType(\"html\",dtdDef,dtdLink,null);
htmlDoc.AppendChild(docType);
添加额外的&amp;到输出。可以尝试其他HTML DTD,但是我很快就没时间了。谢谢。     

解决方法

        总体而言,问题是Microsoft纠正了许多问题。 CDATA避免了一些更正。请注意,此更正是正确的,如果供应商为其UTF-8设置了解析器,则不会有任何问题。有时您只需要说“这就是它”。 所采用的解决方案是在处理流水线的末尾添加一个擦洗“过滤器”。令人讨厌的解决方案,因为它不能正确解决问题,并且客户端(内部)现在希望对所有服务进行过滤。 正确的解决方案是让供应商尊重UTF-8,因此我们不必擦洗完全有效的字符。不幸的是,与许多项目一样,时间比质量更重要。