免责声明:是的,我知道解决方案不是最优的,但它就是这样。
我们正在创建一个大型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浏览器中,它看起来像&lt; b&gt;Intel®Core™Duo&amp; 2 GB RAM&lt; / b&gt; 。
供应商要求将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;#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; amp;到输出。可以尝试其他HTML DTD,但我很快就会用完。感谢。
答案 0 :(得分:0)
总的来说,问题是微软纠正了很多事情。 CDATA避免了一些纠正。请注意,此更正是正确的,如果供应商的解析器设置为UTF-8,则不会出现问题。有时你只需说“它就是它”。
所采用的解决方案是在处理管道的末端添加一个擦洗“过滤器”。讨厌的解决方案,因为它没有正确解决问题,客户端(内部)现在想要过滤所有服务。
正确的解决方案是让供应商尊重UTF-8,这样我们就不必擦洗完全有效的字符。不幸的是,与许多项目一样,时间比质量更重要。