如何使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浏览器中,它看起来像<b>英特尔®酷睿™双核和2 GB RAM </ b>

供应商要求将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; amp; amp; amp; amp; amp; 和&#174; (一个杂乱的®,如174十进制==®),但是如果该符号被识别到XML文档中,则它在加载转义版本时看起来像上面那样。

问题是这是否有一些独特类型的编码或设置或“其他”,可以与.NET XmlDocument一起使用来生成自动地遵循HTML编码规则的节点?

如果无法完成,那很好。 我已经提出了两种可能性:

  • 创建CDATA节点而不是标准文本节点,所以编码不会改变
  • 在文件保存之后转换字符,并将其作为字符串,而不是XmlDocument在WCF服务中提供。
  • 让供应商将数据转换为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

    下一篇: Escape @ character in razor view engine