如何使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><b>Intel® Core™ Duo & 2 GB RAM</b></content>
在HTML浏览器中,它看起来像<b>英特尔®酷睿™双核和2 GB RAM </ b> 。
供应商要求将XML文档中的文本看起来像这样:
<content><b>Intel® Core™ Duo & 2 GB RAM</b></content>
如果这是一个字符串,而不是XML节点中的文本,我可以很容易地做到这一点:
string hackedString = HttpUtility.HtmlEncode(nonHackedTextFromXmlNode);
但编码,然后作为TextNode压入XmlDocument产量:
<content><b>Intel® Core™ Duo & 2 GB RAM</b></content>
所以Microsoft Xml可以识别某些转义的HTML序列,并将它们转换为XML规范中的版本。 通过手动编码来解决问题,我最终可以用&amp; amp; amp; amp; amp; amp; amp; 和&#174; (一个杂乱的®,如174十进制==®),但是如果该符号被识别到XML文档中,则它在加载转义版本时看起来像上面那样。
问题是这是否有一些独特类型的编码或设置或“其他”,可以与.NET 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,但我很快就会耗尽时间。 谢谢。
总体而言,这个问题是微软纠正了很多事情。 CDATA避免了一些修正。 请注意,此更正是正确的,如果供应商将其解析器设置为UTF-8,则不会有任何问题。 有时你只需说“它就是这样”。
所采用的解决方案是在处理管道的末端添加一个清理“过滤器”。 令人讨厌的解决方案,因为它没有妥善解决问题,客户端(内部)现在想要在所有服务上使用过滤器。
正确的解决方案应该是让供应商尊重UTF-8,这样我们就不必擦洗完全有效的字符。 不幸的是,与许多项目一样,时间比质量更重要。
链接地址: http://www.djcxy.com/p/60711.html上一篇: How to make an XmlDocument respect HTML escape sequences