如何使XmlDocument尊重HTML转义序列

时间:2011-06-23 21:36:23

标签: c# .net xml

免责声明:是的,我知道解决方案不是最优的,但它就是这样。

我们正在创建一个大型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浏览器中,它看起来像&lt; b&gt;Intel®Core™Duo&amp; 2 GB RAM&lt; / b&gt;

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

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

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

  1. 创建CDATA节点而不是标准文本节点,因此不会更改编码
  2. 保存文件后转换字符,并在WCF服务中将其作为字符串而不是XmlDocument提供。
  3. 让供应商将数据转换为HTML转义字符串
  4. 思想?

    其他信息: 根据建议,添加了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,但我很快就会用完。感谢。

1 个答案:

答案 0 :(得分:0)

总的来说,问题是微软纠正了很多事情。 CDATA避免了一些纠正。请注意,此更正是正确的,如果供应商的解析器设置为UTF-8,则不会出现问题。有时你只需说“它就是它”。

所采用的解决方案是在处理管道的末端添加一个擦洗“过滤器”。讨厌的解决方案,因为它没有正确解决问题,客户端(内部)现在想要过滤所有服务。

正确的解决方案是让供应商尊重UTF-8,这样我们就不必擦洗完全有效的字符。不幸的是,与许多项目一样,时间比质量更重要。